js计算不准确 解决方案

作为前端首先要明白一点,在某些时候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

减、乘、除与加类似,就不多赘述啦。

原文地址:https://www.cnblogs.com/sixrookie/p/15561168.html