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 位数字,但在打印时四舍五入到略低,只是为了避免看到精度限制。
这是浮点数的正常行为,您会在任何使用浮点数的编程语言中看到相同的结果。浮点数根本不精确,因此在实际需要精确数字的应用程序中(例如银行业务),会使用其他数据类型。
这可能是一个答案非常合乎逻辑的问题。但我真的不明白!!
为什么,这会给出不同的结果..
唯一的区别是 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 位数字,但在打印时四舍五入到略低,只是为了避免看到精度限制。
这是浮点数的正常行为,您会在任何使用浮点数的编程语言中看到相同的结果。浮点数根本不精确,因此在实际需要精确数字的应用程序中(例如银行业务),会使用其他数据类型。