1

我的应用程序中有以下代码,我需要解析一个字符串并将其转换为双精度

int i = ((QString)"294.4").toDouble() * 100;

我应该将值 29440 视为 i 的值。但是,每次这样做,我都会得到 29439 的值。我不确定它为什么会发生,因为它并不总是发生。例如 294.1,294.2,294.3 工作正常。294.5 也可以正常工作。

我知道解释浮点数应该是一个问题,并且可以预料到不确定的行为,但这似乎是一个非常简单的案例。

有人可以指导我如何可靠地解析这些值,以便它总是给我它的字符串等价物表示的确切值吗?

4

1 回答 1

3

这不是 Qt 的问题,而是浮点数的内部表示问题(基于 2,而不是基于 10)。请参阅为什么不使用 Double 或 Float 来表示货币?一些好的背景信息。

如果您依赖精确值,请不要使用浮点数,而是将整数和数字的小数部分存储在单独的整数中,例如

int integ = 294;
int fraction = 4;   /* assumption: one fractional digit */

然后仅将整数算术用于您的计算。

请参阅是否有库类来表示浮点数?用于此类计算的各种现有库的链接。


根据评论的反馈,我建议将字符串解析为整数和小数部分,例如:

struct Money {
    int integ;
    int fract;
};

Money parseMoney(const QString& input) {
    QString cleanInput = input;
    Money result = {0,0};

    // remove group separators
    QLocale locale = QLocale::system();
    cleanInput.remove(locale.groupSeparator());

    // convert to money
    QStringList parts = cleanInput.split(locale.decimalPoint());
    if (parts.count() == 1) {
       result.integ = parts[0].toInt();
    } else if (parts.count() == 2) {
       result.integ = parts[0].toInt();
       result.fract = parts[1].toInt() * 10;
    } else {
         // error, not a number
    }

    return result;
}

假设输入是一个根据当前语言环境格式化的字符串,例如,如果组分隔符是','小数点是'。并且输入字符串是“3,294.4”,Money 中的结果将是 {3294, 40}。

于 2012-10-16T10:27:50.607 回答