Qt QString :: toDouble()产生不精确的结果

时间:2012-10-16 09:40:15

标签: qt parsing double qstring

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

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

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

我理解解释浮点数应该是一个问题,可以预期未确定的行为,但这个似乎是一个非常简单的情况。

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

1 个答案:

答案 0 :(得分:3)

这不是Qt的问题,它是浮点数的内部表示问题(基于2的基础,而不是基于10的基础)。有关一些良好的背景信息,请参阅Why not use Double or Float to represent currency?

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

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

然后仅使用整数算法进行计算。

有关这些计算的各种现有库的链接,请参阅Is there a library class to represent floating point numbers?


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

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}。