Javascript 是否处理整数上溢和下溢?如果是,如何?

新手上路,请多包涵

我们知道 Java 不处理下溢和溢出,但是 Javascript 是如何处理整数的呢?

它会回到最小值/最大值吗?如果是,哪个最小值/最大值?

我需要拆分一个字符串并根据其字符计算哈希值。

原文由 Jérôme Verstrynge 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 471
2 个回答

在一个简单的测试中,当我尝试这个时:

 var max = Number.MAX_VALUE;
var x = max + 10;

var min = Number.MIN_VALUE;
var y = min / 10;

我发现 xmax 具有相同的值(在 Chrome、IE 和 Firefox 中),因此看起来有些溢出只是与最大值挂钩。并且, y0 挂钩,因此一些下溢似乎变为零。

啊哈,但这并不是那么简单。并非所有溢出都转到 Number.MAX_VALUE 并且并非所有下溢都转到 Number.MIN_VALUE 。如果你这样做:

 var max = Number.MAX_VALUE;
var z = max * 2;

然后, z 将是 Infinity

事实证明,这取决于你溢出/下溢的程度。如果你走得太远,你将获得 INFINITY。这是因为使用了 IEEE 754 舍入到最近模式,其中最大值可以被认为比无穷大更接近。有关详细信息,请参阅 添加到 Number.MAX_VALUE 。根据该答案,1.7976931348623158 × 10 308或更大的值四舍五入到无穷大。 Number.MAX_VALUE 之间的值将四舍五入为 Number.MAX_VALUE。

让事情变得更复杂的是,Javascript 还支持渐进下溢。这是浮点值的尾数中有前导零的地方。渐进下溢允许浮点数表示一些较小的数字,如果没有它就无法表示,但它们的精度会降低。

您可以确切地看到限制在哪里:

 >>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity

这是您可以在任何浏览器中尝试的可运行代码段:

 var max = Number.MAX_VALUE;
var x = max + 10;

var min = Number.MIN_VALUE;
var y = min / 10;

var z = max * 2;

document.getElementById("max").innerHTML = max;
document.getElementById("max10").innerHTML = x;
document.getElementById("min").innerHTML = min;
document.getElementById("min10").innerHTML = y;
document.getElementById("times2").innerHTML = z;
 body {
    font-family: "Courier New";
    white-space:nowrap;
}
 Number.MAX_VALUE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= <span id="max"></span><br>
Number.MAX_VALUE + 10 = <span id="max10"></span><br>
<br>
Number.MIN_VALUE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= <span id="min"></span><br>
Number.MIN_VALUE / 10 = <span id="min10"></span><br>
<br>
Number.MAX_VALUE * 2 &nbsp;= <span id="times2"></span><br>

原文由 jfriend00 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题