在Java程序中的点行为

这个问题在这里已经有了答案:

  • 浮点数学是否被破坏? 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