我的应用程序中有以下代码,我需要解析一个字符串并将其转换为double
int i = ((QString)"294.4").toDouble() * 100;
我应该将值29440视为i的值。但是,每次我这样做,我都会得到29439的值。我不确定它为什么会发生,因为它总是不会发生。例如294.1,294.2,294.3工作正常。 294.5也可以正常工作。
我理解解释浮点数应该是一个问题,可以预期未确定的行为,但这个似乎是一个非常简单的情况。
有人可以指导我如何可靠地解析值,以便它总是给出我的字符串等价物所代表的确切值吗?
答案 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}。