Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript循环给出不同的结果_Javascript_Loops_Floating Point Precision - Fatal编程技术网

javascript循环给出不同的结果

javascript循环给出不同的结果,javascript,loops,floating-point-precision,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--) { whi

这可能是一个回答非常合理的问题。。但我真的不明白

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

唯一的区别是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")
    }
array=[1.2344,2.47373,3.444];
var总计=0,
总计2=0,
i=数组长度,
当loops=0时,
forLoops=0;
而(我--){
whileLoops++;
总数+=数组[i];
}
对于(变量i=0,len=array.length;i
我尝试了parseFloat,但这也没有帮助:(

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

应要求:小提琴

更新

解决方案是先计算*1000,然后在所有计算之后再除以1000,以保持整数吗?

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

console.log(total, total2);
返回以下内容:

7.1521300000000005 7.15213
见鬼,只要把0.1+0.2放在浏览器控制台中,看看你会得到什么,而不是你所期望的


这里没有对整个解释重新进行散列,而是有一个非常好的总结和讨论:

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

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

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


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

你能给我们一点提示,或者告诉我们你得到的输出吗?如果你使用整数,你会得到相同的结果。很明显,问题是舍入。
1.2344+2.47373+3.444!=3.444+2.47373+1.2344
不,Javascript浮点数学并不奇怪。它与使用fl的任何其他语言完全相同点的数字。看看这个:谢谢,但我还是觉得很奇怪,一个简单的计算,比如把数字op加在一起,会得到不同的结果…如果我将一个包含10000个浮点数的数字除以一个包含10000个浮点数的数,我能理解它必须“适合”所有的点…我逗号后面只有几个数字是“正常”的吗???@DutchKev:是的,几乎所有逗号后面都有数字的数字都是正常的。有些数字可以精确表示,例如
0.5
0.25
,但它们相对较少。如果你看看数组中的数字在它们的浮动位置会是什么int表示法,很可能两者都不能精确表示。你得到的是每一种最接近的表示法,因此你从一开始就有了一点差异。例如,哪些数据类型用于银行业务?@thomas:为此,你会使用
十进制
货币
数据类型,而h是一个固定点数。基本上它是一个大整数,小数部分使用一定数量的数字。