我们知道Java不处理下溢和溢出 https://stackoverflow.com/questions/3001836/how-does-java-handle-integer-underflows-and-overflows-and-how-would-you-check-fo,但是 Javascript 如何处理这些整数呢?
它会回到最小值/最大值吗?如果是,最小/最大是哪个?
我需要分割一个字符串并根据其字符计算哈希值。
在一个简单的测试中,当我尝试这样做时:
var max = Number.MAX_VALUE;
var x = max + 10;
var min = Number.MIN_VALUE;
var y = min / 10;
我发现x
and max
具有相同的值(在 Chrome、IE 和 Firefox 中),因此看起来某些溢出只是与最大值挂钩。和,y
被挂钩0
所以一些下溢似乎为零。
啊啊,但事情没那么简单。并非所有溢出都会发生Number.MAX_VALUE
并不是所有的下溢都会去Number.MIN_VALUE
。如果你这样做:
var max = Number.MAX_VALUE;
var z = max * 2;
Then, z
将Infinity
.
It turns out that it depends upon how far you overflow/underflow. If you go too far, you will get INFINITY instead. This is because of the use of IEEE 754 round-to-nearest mode where the max value can be considered nearer than infinity. See Adding to Number.MAX_VALUE https://stackoverflow.com/questions/10837670/adding-to-number-max-value for more detail. Per that answer, values of 1.7976931348623158 × 10308 or greater round to infinity. Values between Number.MAX_VALUE and that will round to 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 = <span id="max"></span><br>
Number.MAX_VALUE + 10 = <span id="max10"></span><br>
<br>
Number.MIN_VALUE = <span id="min"></span><br>
Number.MIN_VALUE / 10 = <span id="min10"></span><br>
<br>
Number.MAX_VALUE * 2 = <span id="times2"></span><br>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)