这是我面临的一个奇怪问题。当我将一些大数字传递给JS函数(自定义或内置)时,该值会自动增加1.例如,请参阅:
<!DOCTYPE html>
<html>
<body>
<p>Click the button to display an alert box.</p>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction()
{
alert(10466511635124471);
}
</script>
</body>
</html>
警告中的我看到的是10466511635124472
,而不是10466511635124471
。有人可以解释这种行为吗?
我在FF 17.0.10和Chrome 12.0.742.122以及IE 8中检查了这个。
答案 0 :(得分:2)
Javascript对大整数没有任何支持。它使用64位浮点数来存储数字,精度,符号和指数。
一个好的做法是使用这些数字的字符串表示:
alert("10466511635124471");
请注意来自Facebook图形api的这个JSON响应: 所有小于32位整数的合理数字仍然是整数,但作为facebook用户64位整数作为其ID,它们已被转换为字符串:
答案 1 :(得分:1)
这与IEEE754 double-precision 64-bit floating point math 1 (all compliant JavaScript implementations use this form of IEEE arithmetic)的性质有关 - 你的数字10 466 511 635 124 471大于最高正整数可表示为连续数字,其为2 53 (9 007 199 254 740 992)。 JavaScript中数字的64位用符号表示1位,数字表示52位(指数的特殊行为有效地使53位精度)和指数11位,这就是原因。
当您的数字超过此最大数字时,它将使用大于1的指数来表示此数字,这将导致可能的最小表示降低。如果指数为2(在您的情况下表示),则数字的最小可微变化将为2,并且因为您的数字在这两者之间,所以它将四舍五入到最接近的一个。
JavaScript没有任何大小的整数格式,也不支持类似于BigNum
(使用Java术语)或任意精度算术的任何内容。如果您想存储更大的数字,则必须使用其他一些存储方法,例如字符串。
1: 我已经链接到维基百科,因为实际的规范确实需要合法/正式获取资金 - 如果有人有更好的来源,请编辑它。
答案 2 :(得分:-1)
Javascript中允许的最大正数为1.79E + 308。
你已经取了一个数字(10466511635124471),这个数字大于bigt + ve数。可能这就是得到答案的理由为10466511635124472。