一、存在问题
大家都知道,前端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'
还有常用的