为什么更改总和顺序会返回不同的结果?
23.53 + 5.88 + 17.64
= 47.05
23.53 + 17.64 + 5.88
= 47.050000000000004
Both Java and JavaScript返回相同的结果。
据我了解,由于浮点数以二进制表示的方式,一些有理数(比如 1/3 - 0.333333...) 无法精确表示。
为什么仅仅改变元素的顺序就会影响结果?
也许这个问题很愚蠢,但是为什么简单地改变元素的顺序就会影响结果呢?
它将根据值的大小更改值的舍入点。作为一个例子kind对于我们所看到的事情,让我们假设我们使用的是具有 4 个有效数字的十进制浮点类型,而不是二进制浮点,其中每次加法都以“无限”精度执行,然后四舍五入到最接近的可表示数字。这里有两个总和:
1/3 + 2/3 + 2/3 = (0.3333 + 0.6667) + 0.6667
= 1.000 + 0.6667 (no rounding needed!)
= 1.667 (where 1.6667 is rounded to 1.667)
2/3 + 2/3 + 1/3 = (0.6667 + 0.6667) + 0.3333
= 1.333 + 0.3333 (where 1.3334 is rounded to 1.333)
= 1.666 (where 1.6663 is rounded to 1.666)
我们甚至不需要非整数来解决这个问题:
10000 + 1 - 10000 = (10000 + 1) - 10000
= 10000 - 10000 (where 10001 is rounded to 10000)
= 0
10000 - 10000 + 1 = (10000 - 10000) + 1
= 0 + 1
= 1
这可能更清楚地表明,重要的是我们的数量有限。有效数字- 数量不限小数位。如果我们能够始终保持相同的小数位数,那么至少通过加法和减法,我们就可以了(只要值不溢出)。问题是,当您获得更大的数字时,会丢失更小的信息 - 在本例中 10001 被四舍五入为 10000。 (这是一个问题的例子埃里克·利珀特在他的回答中指出.)
重要的是要注意,右侧第一行的值在所有情况下都是相同的 - 因此,尽管重要的是要了解您的十进制数字(23.53、5.88、17.64)不会完全表示为double
值,这只是一个问题,因为上面显示的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)