【发布时间】:2012-10-11 01:07:08
【问题描述】:
这段 JavaScript 演示了 IE 中的一个错误,现在让我抓狂:
var y = 6044629098073143; // this exact integer easily fits into an IEEE double
document.write(y + " " + Math.round(y)+"<br><br>");
IE 8(和 Opera 12.02)中的输出显示 Math.round 关闭了 1:
6044629098073143 6044629098073144
在 Firefox、Chrome 和 Safari 中的输出是正确的。
IE 和 Opera 到底发生了什么?
【问题讨论】:
-
也许真的是一个 IE 错误?见dojotoolkit.org/reference-guide/1.8/dojo/number.html#round
-
根据ECMA-262,
If x is already an integer, the result is x。但是,由于Math.round(6044629098073144)在 IE 中返回了正确的值,并且随着数字的增加,它一直在正确和 +1 之间振荡(偶数是静态的,奇数是加一的),我怀疑你已经达到了连续 javascript 的限制整数。 -
我们还没有达到连续 javascript 整数的限制(因为所有整数
-
记录一下,IE中
Math.round不加修改返回的最大连续整数是4503599627370496,也就是2^52,之后是2^52,说明有操作在drop一位精度,因为连续整数应该达到 2^53。所以绝对是一个错误。 -
刚刚注意到 ECMA-262 还说“Math.round(x) 的值与 Math.floor(x+0.5) 的值相同”,所以也许这就是缺失位的地方正在运行,因为
Math.floor(y + 0.5)在 IE 中具有完全相同的行为。请注意,来自Math.round的非整数的连续限制无论如何都是 2^52。所以可能不是错误,而是对规范的解释不同。
标签: javascript internet-explorer opera