为什么这个数字会增加一?

8

console.log(10209761399365907);

为什么这段代码会输出一个比原来多1的数字 (10209761399365908而不是10209761399365907)?

只有在这个特定的数字上才会发生这种情况。例如,对于10155071933693662,我得到了正确的值(10155071933693662)。

这个特定数字有什么需要知道的吗?我想到的唯一解决方法是将该值作为字符串传递。


4
相关(甚至可能是重复的):JavaScript中Number类型的最高整数值是多少,而不会失去精度? - Michał Perłakowski
2
@Gothdo 我认为你对这个问题所做的编辑不是一个好主意。具体来说,你删除了最初发布的HTML标记和明确使用字符串作为元素事件处理程序属性值的重要点。 - Pointy
@Pointy 为什么?我删除了很多不必要的信息。我是否删除了与问题相关的内容? - Michał Perłakowski
@Gothdo,原帖是在询问特定的标记语言,而我的被采纳的答案提供了修订版本。 - Pointy
1
@JanDvorak 我不介意将其关闭为重复内容,但覆盖问题的原始内容意味着没有人会因为基于该内容执行搜索而偶然发现这个问题和链接的重复内容。 - Pointy
显示剩余4条评论
1个回答

19

你的数值太大了,无法精确表示为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)">

但是当我点击按钮... 这个方法收到的参数增加了一!

CODE中的警告

这种情况仅发生在一个特定的ID上! 例如,对于10155071933693662,我得到了正确的值(10155071933693662)

有关这个特定数字,我需要知道什么吗? 这一切都非常奇怪,我唯一想到的解决方法是将该值作为字符串传递!


伙计,1020976139936590810209761399365906返回正确的值。为什么只有10209761399365907 - Praveen Kumar Purushothaman
4
@PraveenKumar,这是因为右侧存在丢失的位。在浏览器控制台中输入“Number.MAX_SAFE_INTEGER”并将其与问题中的该值进行比较即可明白。请注意,我已经尽力使翻译通俗易懂,但不会改变原意。 - Pointy
4
@PraveenKumar 那些都是偶数。我好奇它们的二进制表示中低位是什么? - Pointy
3
在这个上下文中,'Large'并不意味着“更大的数字”,而是指“更多比特位上的表示”。 - roberrrt-s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接