【发布时间】:2023-12-23 14:09:01
【问题描述】:
我看过很多关于四舍五入的问题,但它们都涉及将一个数字四舍五入到最接近的整数或某个点数。我想要做的只是将一个字符串转换为双精度而不在小数点右侧添加任何数字。这是我现在的代码和结果:
将字符串 0.78240 转换为双精度值,它应该是 0.78240,但当我在调试器中查看它时却是 0.78239999999999998。
字符串值是一个 QString,只需使用 toDouble() 函数即可转换为双精度值。
我不明白这些额外数字是如何或从哪里来的,但如果能帮助我直接从 QString 转换为 double 将不胜感激!
【问题讨论】:
-
可以在 IEEE 754 64 位二进制中精确表示的最接近 0.78240 的数字是 0.78239999999999998436805981327779591083526611328125。除了选择最接近十进制字符串的可表示数字之外,我不确定您希望 Qt 做什么。
-
那么,0.78240这个数字是不是不能准确表示呢?原谅我对这个话题的无知......如果我继续使用它最接近的表示,所有基于它的计算都会采用相同的形式吗??
-
@PatriciaShanahan : 这不是 Qt 问题,显示的值是由调试器显示的。
-
@Alan 正确。发生这种情况是因为浮点使用二进制格式,它只能表示二进制分数的有限子集。就像没有完全等于 1/3 的小数一样,也没有完全等于 1/10 的二进制小数。
-
@PatriciaShanahan :这是一个有价值的答案的核心 - 考虑回答而不是评论。