关于四舍五入的问题我已经看了很多,但是所有问题都涉及将数字四舍五入到最接近的整数或一定数量的点。我想要做的只是将字符串转换为双精度,而小数点右侧没有任何附加数字。这是我现在的代码和结果:
将字符串0.78240转换为double,应该是0.78240,但是当我在调试器中查看它时,它是0.78239999999999998。
字符串值是一个QString,只需使用toDouble()函数就可以转换为double。
我不明白这些额外数字的来源和来源,但是对于从QString直接转换为双倍的任何帮助都将非常感激!
答案 0 :(得分:2)
因为您要将十进制实际编号转换为二进制浮点,所以会有额外的数字。
与真实数字不同,浮点表示具有无限分辨率和有限范围,并且二进制浮点值与所有(或甚至大多数)不完全一致十进制实际值。
简单的事实是二进制浮点不能完全代表0.78240 10 ,您的调试器会在将二进制值往返三舍五入后向您显示所有可用的数字小数。
这不一定是一个问题,因为与值的大小相比,误差是无穷小的,并且无论如何原始的0.78240值无疑是现实世界值的近似值 - 它们都是近似值,只是二进制或十进制近似值。
这个问题通常是在陈述而不是代表处理。例如,在这种情况下,与调试器不同,调试器必须显示内部表示的完整精度(您不希望在调试器中以任何其他方式使用它),提供此类值的标准方法将自身限制为小,或者调用者定义的小数位数,即使是15位小数也会显示为0.782400000000000(默认标准输出方法只显示0.7824)。
任何double
值以有效十进制数或更少显示将按预期显示,对于float
,此值将降至仅为6数据。我想你的调试器显示的数字更多,可以在IEEE 754 64位FP(双)值中准确显示,因为x86 FPU内部使用80位表示。
你真的在冒汗这些小东西。
这种代表性差异在一个重要的地方是财务应用。对于那些,通常使用十进制浮点,并且通常使用比double
提供的更重要的数字。但是十进制浮点通常不在硬件中实现,因此速度要慢得多。此外,大多数编程语言不直接支持十进制浮点,并且需要库支持。 C#是内置支持十进制浮点的语言示例;其decimal
类型适用于28位重要人物。