这可能是一个非常合乎逻辑的答案的问题..但我真的不明白这一点!!
为什么,这会产生不同的结果..
唯一的区别是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,以保持数字?
答案 0 :(得分:0)
浮点数学(用JavaScript或任何其他语言)有一些你不会想到的怪癖。将它放在代码的末尾:
console.log(total, total2);
返回以下内容:
7.1521300000000005 7.15213
哎呀,只需将0.1 + 0.2放入浏览器控制台,看看你得到了什么。不是你所期望的。
而不是重新整理整个解释,这里有一个非常好的写作和讨论:Is floating point math broken?
答案 1 :(得分:0)
循环的不同之处在于您添加数字的顺序。
对于这些添加中的每一个都存在微小的数据丢失,因为结果必须与两个操作数适合相同的数据类型。丢失的内容取决于数字的数量,因此以不同的顺序添加数字会导致结果的差异很小。
如果您打印出数字,它们可能看起来相同或不同,但在打印时看起来相同并不意味着它们必须具有相同的值。这些数字的精度为15-17位数,但打印时会略微减少,只是为了避免出现精度上的限制。
这是浮点数的正常行为,您会在使用浮点数的任何编程语言中看到相同的结果。浮点数简直不准确,因此在数字实际上必须精确的应用程序(例如银行业务)中,使用其他数据类型。