Skip to content
标签
note
字数
327 字
阅读时间
2 分钟

常见例子

txt
   // 加法
   0.1 + 0.2 = 0.30000000000000004
   0.1 + 0.7 = 0.7999999999999999
   0.2 + 0.4 = 0.6000000000000001

   // 减法
   0.3 - 0.2 = 0.09999999999999998
   1.5 - 1.2 = 0.30000000000000004

   // 乘法
   0.8 * 3 = 2.4000000000000004
   19.9 * 100 = 1989.9999999999998

   // 除法
   0.3 / 0.1 = 2.9999999999999996
   0.69 / 10 = 0.06899999999999999

   // 比较
   0.1 + 0.2 === 0.3 // false
   (0.3 - 0.2) === (0.2 - 0.1) // false

导致原因

JavaScript 内部只有一种数字类型 Number,也就是说,JavaScript 语言的底层根本没有整数,所有数字都是以 IEEE-754 标准格式 64 位浮点数形式储存,11.0 是相同的。

因为有些小数以二进制表示位数是无穷的。JavaScript 会把超出 53 位之后的二进制舍弃,所以涉及小数的比较和运算要特别小心。

解决办法

1. 引用类库

  1. Math.js
  2. decimal.js
  3. big.js

2. 倍数放大

在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型 (最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了

js
   0.1 + 0.2 ——> (0.1 * 10 + 0.2 * 10) / 10 // 0.3
   0.8 * 3 ——> ( 0.8 * 100 * 3) / 100         //2.4

参考

解决JS浮点数运算结果不精确的Bug - 掘金

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写