Javascript Number精度问题与解决
导读
JS 面试中精度和小数四则运算不准确的问题是一个高频问题,下面是想关的记录。
十进制与二进制
下述举例了整数和小数的十进制和二进制相互转换的情况。
1 | (57).toString(2) // 111001 |
由于0.1
被转换为二进制后,其是一个无限不循环小数,加上计算机存储空间有限,就被四舍五入了。
对于JS,其Number类型实际上为双精度浮点型,采用``IEEE 754`标准,其共8字节,用64位二进制表示,其中首位为符号为,11位表示阶码,剩余52位表示尾数。
最大安全整数
有上节,能安全被表示的数的范围为:-2^53~2^53-1
。因此,最大安全整数为2^53-1
,实际是:9007199254740991
。其可以通过Number.MAX_SAFE_INTEGER
快速得出。
其能表示的最大数为2**1023*1.99999999999999
精度丢失问题
下列计算出现了精度丢失的问题
1 | .1+.2 //0.30000000000000004 |
使用toFixed()
方法对0.105
保留两位小数(0.105).toFixed(2)
得到了 0.10
,不是期望的0.11
。
使用toPercision()
方法可以看到其保留更多位数时是不准确的。
1 | 0.105.toPercision(19) //'0.104999999999999996' |
手写保留指定小数位
1 | function digital(num,n){ |
使用外部库解决浮点数运算问题
number-precision
1 | import NP from 'number-precision' |
bignumer.js
1 | import BigNumber from "bignumber.js"; |
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 程序员零塔的小破站!
评论