JavaScript中的安全整数

在做题的时候遇到一个好玩的问题:

题目

鉴于这一系列题目答案都比较出人意料,加上隐隐感觉2^53可能达到JS中数值的一个极限我选了other,算是蒙对了,但是究竟是为什么呢?

参考答案中提示说是2^53是JS中可能取到的最大值,觉得哪里怪怪的,自己试试水:

Chrome测试结果

可以看到+1的时候没有变化,而+2和+10086则取到了更大的值。有猫腻?

搜集资料得到的结论:

  • JS中只有一种类型数,即64位(1bit 的符号位,11bits 的指数部分 ,以及52bits 的小数部分)双精度浮点数,当整数数值过大时,就会发生精度丢失。
  • 所谓安全整数即能够唯一确定的数字,即能够使用64位二进制数唯一确定的整数。考虑253,转换成对应表示方式后其小数部分总共包括53位,发生了精度丢失,所以在JS中无法区别253与2^53+1;
  • 安全整数与JS是否能够正确进行运算关系密切,当运算数与运算结果都处于安全整数的范围内时,才能保证JS运算结果正确。

参考资料
https://www.zhihu.com/question/29010688
http://2ality.com/2013/10/safe-integers.html
http://2ality.com/2012/04/number-encoding.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容