🍏 JavaScript 数字精度丢失相关
相关问题:
- 对于 JavaScript 中数组精度丢失的问题,如何解决?
# 概念
🌰 例子 / 引入:
0.1 + 0.2 === 0.3 // false
1
🔢 JavaScript 数字类型 | notebook (simon1uo.github.io) (opens new window)
# 解决方案
理论上有限的空间不能存储无限的小数,并且保证数字的精确。但是可以处理一下得到期望的结果。
当要展示如 1.4000000000000001
这样的数字时,建议使用 toPrecision
凑整并且使用 parseFloat
转化成数字再显示。
🌰 例子:
parseFloat(1.4000000000000001.toPrecision(12)) === 1.4 // True
1
将这种方法封装为函数:
function strip(num, precision = 12) {
return +parseFloat(num.toPrecision(precision))
}
1
2
3
2
3
对于运算类的操作,例如 加减乘除,就不能使用 toPrecision
。正确的做法是将小数转换成整数后再运算。以加法为例子:
function add(num1, num2) {
const num1Digits = (num1.toString().split('.')[1] || '').length;
const num2Digits = (num2.toString().split('.')[1] || '').length;
const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits))
return (num1 * baseNum + num2 * baseNum) / baseNum
}
1
2
3
4
5
6
2
3
4
5
6
或者使用第三方库, Math.js
/ BigDecimal.js
# 参考
编辑 (opens new window)
📢 上次更新: 2022/09/02, 10:18:16