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

浙公网安备 33010602011771号