JS精度丢失

精度丢失

JS 数字类型只有number类型,相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型。在内部,数字是以 64 位格式 IEEE-754 表示的,所以正好有 64 位(8字节)可以存储一个数字:其中 52 位被用于存储这些数字,其中 11 位用于存储小数点的位置,而 1 位用于符号。

整数精度丢失

JavasSript所能表示的最小值为Number.MIN_SAFE_INTEGER,即 +(2^53 – 1) ,- 9007199254740991,最大值为Number.MAX_SAFE_INTEGER,即 -(2^53 – 1),+ 9007199254740991

超过了这个范围的数字就会产生精度丢失,JavaScript 不会在此类事件中触发 error。比如:

alert( 9999999999999999 ); // 显示 10000000000000000

小数精度丢失

  • 整数转二进制用除二取余法;小数转二进制用乘二取整法。问题就在于小数乘二取整会有无限循环的情况。所以使用二进制数字系统无法 精确 存储 0.10.2
  • JS中的进制转换
    • 十进制转二进制:num.toString(base) 返回在给定 base 进制数字系统中 num 的字符串表示形式
    • 二进制转十进制:parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数

解决方法

  • 将小数转化为整数进行运算
    因为小数乘二取整会有无限循环的情况,但是整数除二取余是不会的
  • 限制精度,只保留小数部分位数:因为小数精度过高的情况下可能出现无限循环
  • 第三方库:math.jsbignumber.jsdecimal.jsbig.jsnumber-precision

https://juejin.cn/post/7264208575973621815#heading-0
https://juejin.cn/post/7270544537671598114

posted @   江一乐  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示