浮点算法不能产生精确的结果

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

  • 浮点数学是否被破坏? 23个答案

  • 如果你需要确切的十进制值,你应该使用java.math.BigDecimal 。 然后阅读“每个计算机科学家应该知道什么是浮点算术”,以了解为什么你会得到这些结果。

    (我有一个以.NET为中心的文章,你可能会发现它更容易阅读 - 当然也更短。Java和.NET之间的差异大多与理解这个问题无关。)


    浮点数使用二进制分数而不是小数。 也就是说,你习惯于由十分之一的数字,百分之一,千分之一等组成的小数部分。d1 / 10 + d2 / 100 + d3 / 1000 ...但是浮点数是二进制的,所以他们有半位数,四分位数,八位数等。d1 / 2 + d2 / 4 + d3 / 8 ...

    许多小数不能准确地表示在任何有限数量的二进制数字中。 例如,1/2是没有问题的:十进制是.5,二进制是.1。 3/4是十进制.75,二进制.11。 但是1/10是十进制的干净的.1,但是在二进制文件中它是.0001100110011 ...与“0011”永远重复。 由于计算机只能存储有限数量的数字,因此在某些时候必须将其切断,所以答案并不准确。 当我们将输出转换回十进制时,我们会看到一个奇怪的数字。

    正如Jon Skeet所说,如果您需要精确的小数部分,请使用BigDecimal。 如果性能问题,您可以推出自己的小数部分。 就像,如果你知道你总是只需要3个小数位,并且数字不会超过一百万左右,那么你可以简单地用假设的3位小数来使用int,在进行算术运算并写入输出时进行必要的调整格式函数将小数点插入正确的位置。 但99%的时间表现并不是一个足够大的问题值得这个麻烦。


    浮点数是不精确的,尤其是因为它们以二进制分数(1/2,1 / 4,1 / 8,1 / 16,1 / 32,...)而不是小数部分(1/10,1 / 100,1/1000,...)。 只需定义你感觉“足够接近”并使用诸如Math.abs(ab) < 0.000001

    链接地址: http://www.djcxy.com/p/27443.html

    上一篇: Floating point arithmetic not producing exact results

    下一篇: Float sum with javascript