目录

🍏 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

对于运算类的操作,例如 加减乘除,就不能使用 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

或者使用第三方库, Math.js / BigDecimal.js

# 参考

📢 上次更新: 2022/09/02, 10:18:16