Skip to content

浮点数的计算

加( + )

  • 正常计算:0.1 + 0.2 = 0.3
  • JavaScript 计算:0.1 + 0.2 = 0.30000000000000004

减( - )

  • 正常计算:1 - 0.9 = 0.1
  • JavaScript 计算:1 - 0.9 = 0.09999999999999998

乘( * )

  • 正常计算:0.0532 * 100 = 5.32
  • JavaScript 计算:0.0532 * 100 = 5.319999999999999

除( / )

  • 正常计算:0.3 / 6 = 0.05
  • JavaScript 计算:0.3 / 6 = 0.049999999999999996

原因分析

JavaScript中的浮点数计算不总是精确的,因为其采用IEEE 754标准,而这个标准基于二进制,不能精确地表示所有的十进制数字。0.1和0.2在二进制表示中是无限循环的,这就导致了精度问题。

解决方案

1.使用 decimal.jsbignumber.js 这样的库,这些库提供了处理大数和高精度的工具

2.转换成整数处理

比如

function numberMultiply(arg1, arg2) {
  let m = 0
  let s1 = arg1.toString()
  let s2 = arg2.toString()

  m += s1.split('.')[1].length
  m += s2.split('.')[1].length

  return ((Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m))
}