这个问题在这里已经有了答案:
浮点数学是否被破坏? 23个答案
编程语言中最常见的浮点值存储 - IEEE单数和双精度 - 对大多数小数不具有精确表示。
原因是它们以二进制浮点格式存储值,而不是十进制浮点格式。 唯一可以精确表示的小数值是两个负幂的和。 数字如下:
0.5(2 ^ -1) 0.125(2 ^ -3) 0.625(2 ^ -1 + 2 ^ -3) 等等。
你所看到的是这样一个事实,即像0.96这样的数字的表示不能完全表示,因为它们不能表示为两个负的幂的和。 因此,当作为小数部分以完全精确度打印出来时,它们不会与原始值匹配。
另请参阅“每位计算机科学家应了解的浮点数”
其他答案提到了为什么,但没有如何避免它。
有几种解决方案:
缩放比例:如果所有数字都是0.01的倍数(例如),则将所有数字乘以100并使用整数算术(确切地说)。 数字类型:如果您的语言具有数字类型(如SQL中的numeric
类型),则可以使用它。 任意精度的合理性:使用像GMP这样的标准库,它允许您将这些数字表示为两个整数的比率。 十进制浮点数:如果你有一个像IEEE-754r那样的十进制浮点数,你可以使用它。
链接地址:
http://www.djcxy.com/p/27453.html
上一篇:
point behaviour in a Java program
下一篇:
Python rounding error with float numbers