作为前端首先要明白一点,在某些时候js的计算是不准确的,简单的比如:0.1+0.2.
因为js使用的是双精度浮点数来计算的(具体是啥我也不知道,大概就是二进制),0.1,0.2这样的仔二进制中相当于1/3这样的无限小数。
简单来讲对于js计算来说,整数的计算是没问题的,但是关于小数位的计算就会出现精度丢失的问题。
那么解决方案来了:把小数转换为整数来进行计算。
(当然了也可以引入很多计算库,比如我使用的就是 mathjs)
var [a,b] = [0.1,0.2];//定义两个变量
首先,我们需要判断是否是带有小数点:
var [a1,b1] = [0,0] try{a1 = (a*1).toString().split('.')[1].length}catch{a1=0} try{b1 = (b*1).toString().split('.')[1].length}catch{b1=0} //此处是获取两个数据里面的小数的位数 //此处之所以 *1是为了避免我们一时疏忽传入了字符串类型,*1可以将数字类型的字符串转换为数字
然后,就是把数据转换为整数了:
var c = Math.pow(10,Math.max(a1,b1)); //这个是获取两个位数中最大的小数位数,并且返回10的n次幂 var d = (a*1*c) + (b*1*c); //此时计算的是整数相加的结果,还不是最后结果 var e = d /c; //将整数结果除去10的n次幂,得到的就是最终结果
最后,完整代码:
var [a,b] = [0.1,0.2];
var [a1,b1] = [0,0] try{a1 = (a*1).toString().split('.')[1].length}catch{a1=0} try{b1 = (b*1).toString().split('.')[1].length}catch{b1=0}
var c = Math.pow(10,Math.max(a1,b1));
var e = ((a*1*c) + (b*1*c))/c;
//e:0.3
减、乘、除与加类似,就不多赘述啦。