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.1 或 0.2
- JS中的进制转换
- 十进制转二进制:
num.toString(base)
返回在给定 base 进制数字系统中 num 的字符串表示形式 - 二进制转十进制:
parseInt(string, radix)
解析一个字符串并返回指定基数的十进制整数
- 十进制转二进制:
解决方法
- 将小数转化为整数进行运算
因为小数乘二取整会有无限循环的情况,但是整数除二取余是不会的 - 限制精度,只保留小数部分位数:因为小数精度过高的情况下可能出现无限循环
- 第三方库:math.js、bignumber.js、decimal.js 、big.js、number-precision
https://juejin.cn/post/7264208575973621815#heading-0
https://juejin.cn/post/7270544537671598114
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通