简而言之,我的问题是,为什么浮点数中的舍入误差仅在计算后出现,而不是在存储文字时出现?
我的意思是这样的——
我知道在十进制与二进制相互转换时由于浮点数的舍入误差而出现的问题。
例如,在 Java 中:
double a = 10.567;
double b = 2.16;
double c = a * b;
然后,c 存储值 22.824720000000003,而不是 22.82472。
这是因为结果22.82472无法准确地存储在double类型的有限二进制数字中。然而,10.567 和 2.16(即 a 和 b)也不能。
但是如果我打印 a 和 b 的值,它们会被准确地打印出来,没有任何舍入误差。为什么这里没有显示舍入误差?
这是否意味着浮点文字的表示与浮点计算结果的表示有所不同?
文字转换中存在舍入误差,它恰好对您隐藏。 10.567 无法用二进制表示,因此它会四舍五入到最接近的可表示值double
值为
10.56700000000000017053025658242404460906982421875
然而,该算法不是打印精确的值(这会相当烦人),而是打印尽可能少的数字,这样如果将其转换回二进制,它将给出相同的值(在本例中为“10.567”)。
事实证明,对于double
s,您可以对最多 15 位的任何小数执行此操作,请参阅http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/ http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)