浮点数陷阱

在 JS 中对浮点数 toFixed 四舍五入会陷阱

  1. .105 .toFixed(2); // => "0.10"
  2. .104 .toFixed(2); // => "0.10"
  3. .106 .toFixed(2); // => "0.11"

这里好似是 五舍六入
其实是精度问题

.105 .toPrecision(18); // => "0.104999999999999996"

安全数

JS 的 Number 类型是一个 64位双精度浮点数类型,
安全数、浮点数陷阱、大数危机 - 图1
第 1 位表示 符号
2 - 13 位表示 子数位

  • 2**11 == 2048
    • 子数范围是 -1024 至 1024
    • 所以物理上最大的数是
    • 2*10231.9999999999999998
    • Number.MAX_VALUE
    • Number.MIN_VALUE

后面 52 位 小数位

安全数是在这个范围内精度是正确的,超过之后是不准
安全数、浮点数陷阱、大数危机 - 图2
Number.MAX_SAFE_INTEGER
Number.MIN_SAFE_INTEGER