我们知道 Java 不处理下溢和溢出,但是 Javascript 是如何处理整数的呢?
它会回到最小值/最大值吗?如果是,哪个最小值/最大值?
我需要拆分一个字符串并根据其字符计算哈希值。
原文由 Jérôme Verstrynge 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们知道 Java 不处理下溢和溢出,但是 Javascript 是如何处理整数的呢?
它会回到最小值/最大值吗?如果是,哪个最小值/最大值?
我需要拆分一个字符串并根据其字符计算哈希值。
原文由 Jérôme Verstrynge 发布,翻译遵循 CC BY-SA 4.0 许可协议
最大值和最小值是 +/- 9007199254740992
尝试这些 数字类型属性:
alert([Number.MAX_VALUE, Number.MIN_VALUE]);
来自 ECMAScript 2020 语言规范, “数字类型” 部分:
请注意,所有大小不大于 2 53的正负数学整数都可以用 Number 类型表示(实际上,数学整数 0 有两种表示形式,+0 和 −0)。
测试:
var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !
原文由 Rahul Tripathi 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
在一个简单的测试中,当我尝试这个时:
我发现
x
和max
具有相同的值(在 Chrome、IE 和 Firefox 中),因此看起来有些溢出只是与最大值挂钩。并且,y
与0
挂钩,因此一些下溢似乎变为零。啊哈,但这并不是那么简单。并非所有溢出都转到
Number.MAX_VALUE
并且并非所有下溢都转到Number.MIN_VALUE
。如果你这样做:然后,
z
将是Infinity
。事实证明,这取决于你溢出/下溢的程度。如果你走得太远,你将获得 INFINITY。这是因为使用了 IEEE 754 舍入到最近模式,其中最大值可以被认为比无穷大更接近。有关详细信息,请参阅 添加到 Number.MAX_VALUE 。根据该答案,1.7976931348623158 × 10 308或更大的值四舍五入到无穷大。 Number.MAX_VALUE 之间的值将四舍五入为 Number.MAX_VALUE。
让事情变得更复杂的是,Javascript 还支持渐进下溢。这是浮点值的尾数中有前导零的地方。渐进下溢允许浮点数表示一些较小的数字,如果没有它就无法表示,但它们的精度会降低。
您可以确切地看到限制在哪里:
这是您可以在任何浏览器中尝试的可运行代码段: