javascript循环给出不同的结果

时间:2015-01-20 23:07:00

标签: javascript loops floating-point-precision

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

为什么,这会产生不同的结果..

唯一的区别是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引擎以某种方式舍入数字???

根据要求:小提琴http://jsfiddle.net/5dsx0ump/

更新

解决方案是首先到* 1000并且在所有计算之后再次除以1000,以保持数字?

2 个答案:

答案 0 :(得分:0)

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

console.log(total, total2);

返回以下内容:

7.1521300000000005 7.15213

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

而不是重新整理整个解释,这里有一个非常好的写作和讨论:Is floating point math broken?

答案 1 :(得分:0)

循环的不同之处在于您添加数字的顺序。

对于这些添加中的每一个都存在微小的数据丢失,因为结果必须与两个操作数适合相同的数据类型。丢失的内容取决于数字的数量,因此以不同的顺序添加数字会导致结果的差异很小。

如果您打印出数字,它们可能看起来相同或不同,但在打印时看起来相同并不意味着它们必须具有相同的值。这些数字的精度为15-17位数,但打印时会略微减少,只是为了避免出现精度上的限制。

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