Press "Enter" to skip to content

JS的浮点数计算精度问题

0.1 * 3 应该等于0.3这是正常理解对吧

可是js告诉我不是0.3 我测试输出0.30000000002 惊呆了

怎么办 还好前人已经帮我们解决 可以使用 decimal.js 这个库

https://www.jianshu.com/p/2ed7129a7ed0

这是别人的解决方案 我copy一下 留作参考

API

1.获取绝对值

a = Decimal.abs(x)
b = new Decimal(x).abs()
a.equals(b)                    // true

x = new Decimal(-0.8)
y = x.absoluteValue()         // '0.8'
z = x.abs()                   // '0.8'

2.获取整数

a = Decimal.trunc(x)
b = new Decimal(x).trunc()
a.equals(b)                    // true

x = new Decimal(123.456)
x.truncated()                            // '123'
y = new Decimal(-12.3)
y.trunc()                                // '-12'

3.获取正无穷大方向的整数

a = Decimal.ceil(x)
b = new Decimal(x).ceil()
a.equals(b)                    // true

x = new Decimal(1.3)
x.ceil()                      // '2'
y = new Decimal(-1.8)
y.ceil()                      // '-1'

4.获取负无穷大方向的整数

a = Decimal.floor(x)
b = new Decimal(x).floor()
a.equals(b)                    // true

x = new Decimal(1.8)
x.floor()                   // '1'
y = new Decimal(-1.3)
y.floor()                   // '-2'

5.获取最大值

r = Decimal.max(x, y, z)

6.获取最小值

r = Decimal.min(x, y, z)

7.获取大于等于0小于1的随机数

Decimal.set({ precision: 10 })
Decimal.random()                    // '0.4117936847'
Decimal.random(20)                  // '0.78193327636914089009'

8.获取小数位数

x = new Decimal(1.234)
x.decimalPlaces()              // '3'
y = new Decimal(987.654321)
y.dp()                         // '6'

9.获取反值

x = new Decimal(1.8)
x.negated()                              // '-1.8'
y = new Decimal(-1.3)
y.neg()                                  // '1.3'

10.获取位数

x = new Decimal(1.234)
x.precision()                            // '4'
y = new Decimal(987000)
y.sd()                                   // '3'
y.sd(true)                               // '6'

11.获取指定小数位数的字符串

x = 3.456
y = new Decimal(x)
x.toFixed()                       // '3'
y.toFixed()                       // '3.456'
y.toFixed(0)                      // '3'
x.toFixed(2)                      // '3.46'
y.toFixed(2)                      // '3.46'
y.toFixed(2, Decimal.ROUND_DOWN)  // '3.45'
x.toFixed(5)                      // '3.45600'
y.toFixed(5)                      // '3.45600'

12.保留小数指定位数

x = new Decimal(12.34567)
x.toDecimalPlaces(0)                      // '12'
x.toDecimalPlaces(1, Decimal.ROUND_UP)    // '12.3'

y = new Decimal(9876.54321)
y.toDP(3)                           // '9876.543'
y.toDP(1, 0)                        // '9876.6'
y.toDP(1, Decimal.ROUND_DOWN)       // '9876.5'
  1. 加法

a = Decimal.add(x, y)
b = new Decimal(x).plus(y)
a.equals(b)                    // true

0.1 + 0.2                                // 0.30000000000000004
x = new Decimal(0.1)
y = x.plus(0.2)                          // '0.3'
new Decimal(0.7).plus(x).plus(y)         // '1.1'

14.减法

a = Decimal.sub(x, y)
b = new Decimal(x).sub(y)
a.equals(b)                    // true

0.3 - 0.1                                // 0.19999999999999998
x = new Decimal(0.3)
x.minus(0.1)                             // '0.2'

15.乘法

a = Decimal.mul(x, y)
b = new Decimal(x).mul(y)
a.equals(b)                    // true

0.6 * 3                                  // 1.7999999999999998
x = new Decimal(0.6)
y = x.times(3)                           // '1.8'
new Decimal('7e+500').times(y)           // '1.26e+501'

16.除法

a = Decimal.div(x, y)
b = new Decimal(x).div(y)
a.equals(b)                    // true

x = new Decimal(355)
y = new Decimal(113)
x.dividedBy(y)             // '3.14159292035398230088'
x.div(5)                   // '71'

17.%模运算

a = Decimal.mod(x, y)
b = new Decimal(x).mod(y)
a.equals(b)                    // true

1 % 0.9                                  // 0.09999999999999998
x = new Decimal(1)
x.modulo(0.9)                            // '0.1'

y = new Decimal(8)
z = new Decimal(-3)
Decimal.modulo = 1
y.mod(z)                                 // '2'
Decimal.modulo = 3
y.mod(z)                                 // '-1'

作者:张思学
链接:https://www.jianshu.com/p/2ed7129a7ed0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表评论