关于记录js精度加减问题(笔记)

876 阅读2分钟

背景 

由于业务中购物车需要加减且商品通常会有小数点。因此业务中会小数点加减的计算

第一次解决的方案

起初在不是很了解的情况下,对于此类计算想采用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

www.npmjs.com/package/num…

用法:

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精度网上有各种方案的解决,这里只不过我在网上了解并应用到项目的其中一种方式去解决;