vue 前端 小数精度计算

730 阅读2分钟

一、存在问题

大家都知道,前端js计算带有小数计算时,会出现精度的问题例如:

console.log(0.1 + 0.2);    // 输出: 0.30000000000000004
console.log(19.9 + 20.1);  // 输出: 39.999999999999996

原因大家都知道,遇到问题时都清楚,我这再说一下:

JavaScript中使用了IEEE 754标准进行浮点数运算。在该标准中,一个浮点数由符号位、指数位和尾数位组成。这种表示方法可以表示大量的数字,所以在某些情况下,它可能无法精确地表示某些数字。

二、踩过的坑儿

许多人首先选的是toFixed方法,通过toFixed保留小数的方式,可以解决一般运算的精度问题。需保证操作的数据为Number需注意****toFixed操作后的数据为String

但是,toFixed 存在一种四舍五入的机制:叫 银行家舍入法;

四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一11.556 = 11.56 ------六入11.554 = 11.55 -----四舍11.5551 = 11.56 -----五后有数进位11.545 = 11.54 -----五后无数,若前位为偶数应舍去11.555 = 11.56 -----五后无数,若前位为奇数应进位
所以就存在当toFixed(2)四舍五入保留两位小数,第三位大于等于5时,有时候会进位,有时不会进位;

原理请进:这里

三、有效的方法推荐

亲测有效的方法:可以使用 decimal.js 组件:可以有效避免精度计算问题。

1.使用方式

首先,你需要在Vue项目中安装decimal.js库。可以通过以下命令使用npm进行安装:

npm install --save decimal.js

import Decimal from 'decimal.js';

2.官方文档

www.imxiangyang.com/statics/dec…

3.简单介绍常用方法

首先肯定是加减乘除:

加:add
a = Decimal.add(x, y)
b = new Decimal(x).plus(y)
a.equals(b)          

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

乘: mul
a = Decimal.mul(x, y)
b = new Decimal(x).mul(y)


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

toFixed方法,(此方法跟js number对象带的toFixed不同)
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'

还有常用的 

isZero 判断值是否为0的方法;
isNaN 判断值是否问NaN的方法;
---------------------------------------------THE END----------------------------------------------