Javascript中的一些大数字问题

时间:2013-11-26 06:44:27

标签: javascript biginteger

这是我面临的一个奇怪问题。当我将一些大数字传递给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中检查了这个。

3 个答案:

答案 0 :(得分:2)

Javascript对大整数没有任何支持。它使用64位浮点数来存储数字,精度,符号和指数。

一个好的做法是使用这些数字的字符串表示:

alert("10466511635124471");

请注意来自Facebook图形api的这个JSON响应: 所有小于32位整数的合理数字仍然是整数,但作为facebook用户64位整数作为其ID,它们已被转换为字符串:

http://graph.facebook.com/cocacola

答案 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。