2012-10-16 24 views
1

我在我的应用程序下面的代码,其中我需要解析字符串并将其转换为加倍的Qt的QString :: toDouble()产生不精确结果

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

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

我明白,解释浮点数应该是一个问题,并且可以预期不确定的行为,但这个似乎是一个非常简单的例子。

有人可以请指导我如何可靠地解析值,以便它始终给我由它的字符串等效代表的确切值?

回答

3

这不是Qt的问题,它是浮点数的内部表示(以base-2为基础,而不是以base-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?链接到各种现有的库用于这些类型的计算。


基于来自评论反馈,我建议解析串入整数和小数部分,例如是这样的:

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

+0

我明白了。这里的主要问题是,提供价值的是用户。在这种情况下,我不能要求用户输入整数的东西的货币和价格。我正在寻找的只是一种可靠地解析价值的方法。一旦解析完美,它对我来说工作得很好。 –

+0

我也明白,这不是Qt的问题,而是一个普遍的问题。 –

+0

你得到的值是一个字符串? –

相关问题