javascript循环给出不同的结果
这可能是一个回答非常合理的问题。。但我真的不明白 为什么,这会产生不同的结果 唯一的区别是for循环和while循环。。即使它们循环了同样多的次数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
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是一个固定点数。基本上它是一个大整数,小数部分使用一定数量的数字。