开发者

JavaScript integer overflow

开发者 https://www.devze.com 2023-02-07 23:58 出处:网络
The following code console.log(Math.pow(2, 53)); console.log(Math.pow(2, 53) + 1); 开发者_如何转开发

The following code

console.log(Math.pow(2, 53)); 
console.log(Math.pow(2, 53) + 1);
开发者_如何转开发

produces exactly same output for both calculations:

9007199254740992

Why?


The result you see occurs because Math.Pow() is working with floating point numbers, and when you reach the 16th decimal digit, you can't necessarily add one to the least significant decimal digit of the value and expect the result to change.

There are typically, in a 64-bit (8-byte) IEEE 754 floating-point binary value, 53 bits for the mantissa (including the implied 1-bit). Your calculation Math.Pow(2, 53) requires 54 bits in the mantissa to be guaranteed of a change. If you add 2, you should see the change.


All Javascript numbers are double.

0

精彩评论

暂无评论...
验证码 换一张
取 消