Skip to main content

Javascript 小数精度问题

精度丢失

小数

大家先思考下下面几个问题:

0.1 + 0.2 = ? 0.3
0.07 * 100 = ? 7
1 - 0.9 = ? 0.1

JavaScript 的数字在存储时并不区分numberfloat类型,而是采用 IEEE 754 标准的 64 位双精度浮点数来存储的。那么 IEEE 754 定义的双精度浮点数的格式是什么呢?

  1. 了解 IEEE 754 格式
  • 1 位符号位 (sign)
  • 11 位指数位 (exponent)
  • 52 位尾数位 (fraction)

accurate.png

  1. 小数进制转换

我们知道十进制转换 其他 进制 分为 整数转换小数转换

整数: 转换数值 除以 进制数 取余,放后面

小数: 转换数值 乘以 进制数 取整数位, 放前面

# 0.1  十进制 -> 二进制
0.1 * 2 = 0.20
0.2 * 2 = 0.40
0.4 * 2 = 0.80
0.8 * 2 = 1.61
0.6 * 2 = 1.21
0.2 * 2 = 0.40
0.4 * 2 = 0.80
0.8 * 2 = 1.61
0.6 * 2 = 1.21
.... n

# 0.1 = 0.0001 1001 1...

整数

Number.MAX_SAFE_INTEGER = 9007199254740991 = Math.pow(2, 53) - 1

Number.MIN_SAFE_INTEGER = -9007199254740991 = -(Math.pow(2, 53) - 1)

整数在安全值域内[-9007199254740991, 9007199254740991]亦会如此

参考资料

Wiki IEEE 754