javascript 循环给出不同的结果

javascript loops give different results

这可能是一个答案非常合乎逻辑的问题。但我真的不明白!!

为什么,这会给出不同的结果..

唯一的区别是 for 循环和 while 循环。即使它们循环的次数完全一样???

array = [1.2344, 2.47373, 3.444];

    var total = 0,
        total2 = 0,
        i = array.length,
        whileLoops = 0,
        forLoops = 0;

    while (i--) {
        whileLoops++;
        total += array[i];
    }

    for (var i = 0, len = array.length; i < len; i++) {
        forLoops++;
        total2 += array[i];
    }

    if (total !== total2) {
        console.log("BOE")
    }

我尝试了 parseFloat,但这也无济于事:(

这是因为 Javascript 引擎以某种方式舍入数字???

根据要求:fiddlehttp://jsfiddle.net/5dsx0ump/

更新

解决方案是先对 a * 1000 进行所有计算,然后再除以 1000 以保留整数吗?

浮点数学(在 JavaScript 或任何其他语言中)有一些您不会想到的怪癖。把它放在代码的末尾:

console.log(total, total2);

Returns 如下:

7.1521300000000005 7.15213

哎呀,只需在浏览器控制台中输入 0.1 + 0.2,看看会得到什么。不是你所期望的。

无需重新散列整个解释,这里有一篇非常好的文章和讨论:Is floating point math broken?

循环中的区别在于您添加数字的顺序。

对于这些加法中的每一个,都会有少量数据丢失,因为结果必须符合与两个操作数相同的数据类型。丢失的内容取决于数字是多少,因此以不同顺序添加数字会导致最终结果略有不同。

如果您打印出数字,它们看起来可能相同也可能不同,但打印时看起来相同并不意味着它们必须具有相同的值。这些数字的精度为 15-17 位数字,但在打印时四舍五入到略低,只是为了避免看到精度限制。

这是浮点数的正常行为,您会在任何使用浮点数的编程语言中看到相同的结果。浮点数根本不精确,因此在实际需要精确数字的应用程序中(例如银行业务),会使用其他数据类型。