背景
由于业务中购物车需要加减且商品通常会有小数点。因此业务中会小数点加减的计算
第一次解决的方案
起初在不是很了解的情况下,对于此类计算想采用toFixed
但发现toFixed方法是四舍五入保留2位小数,明显是不行的。
在经过一些思考后,采用加与减前,俩个计算前先乘于100,计算后再除于100
做个例子
<div class="hello">
<div>
<input type="text" v-model.number="number1"/>
</div>
<div>
<input type="text" v-model.number="number2"/>
</div>
<div>{{total}}</div>
</div>
computed:{
total(){
return ((this.number1*100)+(this.number2*100))/100
}
},
data(){
return {
number1:'',
number2:'',
}
}
结果,在普通的计算都没什么问题
当计算的数变成一些其他数字,这时候可以说明这种方法并不能解决。
之后的开始去了解js的精度问题,例如经典的0.1+0.2!=0.3;
0.1+0.2的问题一直是困扰前端的计算
JavaScript是如何表示数字的?
javaScript数字全部是浮点数。 根据 IEEE 754标准中的64位二进制(binary64), 也称作双精度规范(double precision)来储存。64位二进制的问题有个问题是(不是所有的十进制分数都能够非常精确的表示 ),具体有兴趣可以去百度查看。
就以0.1,0.2为例,0.1和0.2都不能够被精确的表示成二进制浮点数。但是这个偏差通常非常非常小,小到不能够被表示出来,加法可以使这个偏差变得可见,因此会造成这个问题
0.1 + 0.2
0.30000000000000004
解决
采用了第三方库来解决这个js精度问题
number-precision
用法:
NP.strip(num) //将数字剥离到最接近的右边数字
NP.plus(num1, num2, num3, ...) // 加法
NP.minus(num1, num2, num3, ...) // 减法
NP.times(num1, num2, num3, ...) // 乘法
NP.divide(num1, num2, num3, ...) // 除法
NP.round(num, ratio) // 根据比率四舍五入一个数字
结语:对于js精度网上有各种方案的解决,这里只不过我在网上了解并应用到项目的其中一种方式去解决;