我从QString得到错误的转换值到double。以下是我的代码。
QString value = "0.525";
bool status = false;
double doubleVal = value.toDouble(&status);
doubleVal 的值为0.52500000000000002
。我期待它是0.525
。
有人可以帮我解决这个问题吗? 感谢。
答案 0 :(得分:4)
如果不幸的话,你的期望是相当没有根据的。您只能确保所有非整数实数在任何基数的位置系统中都具有无限长度表示(请参阅this answer)。
有理数的有限长度表示仅存在于某些基数中。碰巧有理数525/1000在基数2中没有有限长度表示;该基数的代表是0.100001(1001)。它在基数10(以及其他)中具有有限长度表示。
double{0.525}
在基数10中仅具有无限长度表示。数字0.52500000000000002
被截断为覆盖IEEE-754双精度二进制表示中的尾数位数的小数位数。
由于float
或double
是base-2系统中的位置表示,因此您应该期望任何非整数实数都需要无限长度表示才能准确表示,并且仅有些将能够以有限的长度表示。
答案 1 :(得分:2)
这是一个known issue。或者说,根本不是问题,这就是为什么它在没有修复的情况下被关闭的原因。
这应该不是问题:您不应该依赖于double
在其所有数字中具有特定值。允许合理的 epsilon 偏差/准确度。