解决js浮点数精度丢失:number-precision/bignumber.js

3,031 阅读1分钟

一、js浮点数精度丢失

0.1 + 0.2 === 0.30000000000000004
2.3 + 2.4 === 4.699999999999999
1 - 0.9 === 0.09999999999999998
3 * 0.3 === 0.8999999999999999
0.362 * 100 === 36.199999999999996
1.21 / 1.1 === 1.0999999999999999
0.105.toFixed(2) === '0.10' // true,toFixed四舍五入的效果在此例上没有体现

toFixed详解

      const a = 0.1
      const b = 0.2

      console.log(a + b) // 0.30000000000000004
      console.log((a * 10 + b * 10) / 10) // 0.3

二、使用number-precision解决

1、安装

npm install number-precision --save

2、引入

import NP from 'number-precision'

3、使用

    console.log(NP.plus(0.1, 0.2)) // 0.3
    console.log(NP.plus(2.3, 2.4)) // 4.7

    console.log(NP.minus(1, 0.9)) // 0.1

    console.log(NP.times(3, 0.3)) // 0.9
    console.log(NP.times(0.362, 100)) // 36.2

    console.log(NP.divide(1.21, 1.1)) // 1.1

保留几位小数点,实现了toFixed在此场景下四舍五入的功能

    console.log(NP.round(0.105, 2)) // 0.11

三、使用bignumber.js解决

1、安装

npm install bignumber.js --save

2、引入

import BigNumber from 'bignumber.js'

3、使用

    const a = new BigNumber(0.1)
    console.log(a.plus(0.2).toString()) // 0.3

    const a = new BigNumber(1)
    console.log(a.minus(0.9).toString()) // 0.1

    const a = new BigNumber(3)
    console.log(a.times(0.3).toString()) // 0.9

    const a = new BigNumber(1.21)
    console.log(a.div(1.1).toString()) // 1.1

取余

    const a = new BigNumber(10)
    console.log(a.mod(4).toString()) // 2

比较大小

    const a = new BigNumber(10)
    console.log(a.eq(10)) // true 是否相等
    console.log(a.gt(9)) // true a是否大于9
    console.log(a.gte(9)) // true a是否大于等于9
    console.log(a.lt(9)) // false a是否小于9
    console.log(a.lte(9)) // false a是否小于等于9