console.log(10209761399365907);
为什么这段代码会输出一个比原来多1的数字 (10209761399365908而不是10209761399365907)?
只有在这个特定的数字上才会发生这种情况。例如,对于10155071933693662,我得到了正确的值(10155071933693662)。
这个特定数字有什么需要知道的吗?我想到的唯一解决方法是将该值作为字符串传递。
console.log(10209761399365907);
为什么这段代码会输出一个比原来多1的数字 (10209761399365908而不是10209761399365907)?
只有在这个特定的数字上才会发生这种情况。例如,对于10155071933693662,我得到了正确的值(10155071933693662)。
这个特定数字有什么需要知道的吗?我想到的唯一解决方法是将该值作为字符串传递。
你的数值太大了,无法精确表示为64位浮点数。所得到的值是近似值。JavaScript本身只有64位浮点数;在C或C++中适合于long
的值可能也因为一些64位用于浮点表示中的指数而无法被精确表示。 (权衡起见,使用浮点数可以处理比简单整数表示更大或更小的数值近似值)
如果不重视将该值作为数字进行操作,则将其转换为字符串:
console.log("10209761399365907");
或者按照我最初提出的建议:
<input type="button" value="Invita" onclick="Invite('@us.FacebookID')" />
其中“FacebookID”是需要处理的大数字。
在较新的JavaScript环境中,有一个常量叫做Number.MAX_SAFE_INTEGER
,它告诉你可以表示多大的数字使得该值被准确地表示;也就是说,64位浮点数基数将包含整个值的显式位。
更大的偶数整数可以被精确地表示,具体取决于其二进制表示的低端有多少个零位。因此,1152921504606846800
可以精确地表示,因为它在二进制表示的低端有7个零位。然而,1152921504606846801
变成了1152921504606846800
,因为那个低位的1
没有地方去。(未表示的位被认为是零。)
补充说明:以下是原始问题的(几乎)原始版本,以解释上面引用的可能令人困惑的示例代码:
我遇到了一个相当奇怪的Javascript问题。 我的服务器发送一些ID,当我按下按钮时,参数将传递给执行请求的方法。
这是代码:
<script type="text/javascript">
function Invite(id)
{
alert(id);
}
</script>
另一方面,我有:
(CSHTML语法)
<input type="button" value="Invita" onclick="Invite(@us.FacebookID)" />
那变成了:
<input type="button" value="Invita" onclick="Invite(10209761399365907)">
但是当我点击按钮... 这个方法收到的参数增加了一!
这种情况仅发生在一个特定的ID上! 例如,对于10155071933693662,我得到了正确的值(10155071933693662)
有关这个特定数字,我需要知道什么吗? 这一切都非常奇怪,我唯一想到的解决方法是将该值作为字符串传递!
10209761399365908
和10209761399365906
返回正确的值。为什么只有10209761399365907
? - Praveen Kumar Purushothaman