Javascript 为什么在JS中重新组合总和有时会产生不同的结果?

Javascript 为什么在JS中重新组合总和有时会产生不同的结果?,javascript,floating-point,addition,Javascript,Floating Point,Addition,为什么对总和进行不同的排序会产生不同的结果(请注意,这个问题是不是关于为什么0.1+0.2不是0.3的问题) 这是因为中间结果的价值 在第一个示例中,按以下顺序执行: 15.2+30.7=45.9 45.9+3=48.9 所以我们有一个中间结果45.9 在第二个示例中,按以下顺序执行: 30.7+3=33.7 15.2+33.7=48.9 …因此我们得到了中间结果33.7 显然,我们都知道的(旧的)不精确性是随着第二个而不是第一个出现的。我假设第一种情况下的中间值(33.7或非常接近)是可精确表

为什么对总和进行不同的排序会产生不同的结果(请注意,这个问题是不是关于为什么0.1+0.2不是0.3的问题)


这是因为中间结果的价值

在第一个示例中,按以下顺序执行:

  • 15.2+30.7=45.9

  • 45.9+3=48.9

  • 所以我们有一个中间结果45.9

    在第二个示例中,按以下顺序执行:

  • 30.7+3=33.7

  • 15.2+33.7=48.9

  • …因此我们得到了中间结果33.7

    显然,我们都知道的(旧的)不精确性是随着第二个而不是第一个出现的。我假设第一种情况下的中间值(33.7或非常接近)是可精确表示的,但第二种情况下的中间值(48.9或非常接近)不是;或者至少第一个中间值比第二个中间值更精确

    IEEE-754标准要求将中间结果四舍五入到该类型可容纳的最接近值,而不是以更精确的形式保存,显然是为了增加平台之间的兼容性。From(从该链接而来):

    IEEE标准要求加法、减法、乘法和除法的结果必须精确四舍五入。也就是说,必须精确计算结果,然后四舍五入到最接近的浮点数(使用四舍五入到偶数)

    完全指定算术运算结果的一个原因是为了提高软件的可移植性。当一个程序在两台机器之间移动,并且两台机器都支持IEEE算法时,如果任何中间结果不同,那一定是因为软件错误,而不是因为算法不同


    原因是一样的。这些浮点错误还取决于中间结果,在使用括号时会更改中间结果。这是否回答了您的问题?还有其他问题吗
    15.2 + 30.7 + 3 = 48.9 
    
    15.2 + (30.7 + 3) = 48.900000000000006