比如
60 * 0.0976 js运算结果是5.856000000000001 而计算器运算结果是5.856
结果不一致
原因是
1,是由于浮点数的精度问题并不是JavaScript所独有的,例如在java中,我们运行以下代码,同样会输出和JavaScript中一样的结果。
因为电脑永远都是按照二进制进行运算的,我们输入的十进制数在转化为二进制数时,并不总如人意,意思是说有些十进制并不能用准确的二进制数表示。
比如十进制的1.1,在用二进制表示的时因为存在二进制位无限循环的表示,实际值为1.0999999999...无限接近与1.1
所以要想和计算器运算结果一直,有以下四种方法:
1、除法方法
调用:divisionMethod(1,2);
function divisionMethod(a1,b1){
//a1是被除数 除号前面
//b1是除数 除号后面
//return 是相除的结果
var t1=0,t2=0,r1,r2;
try{t1=a1.toString().split(".")[1].length}catch(e){} //--小数点后的长度
try{t2=b1.toString().split(".")[1].length}catch(e){} //--小数点后的长度
r1=Number(a1.toString().replace(".","")) //--去除小数点变整数
r2=Number(b1.toString().replace(".","")) //--去除小数点变整数
return (r1/r2)*Math.pow(10,t2-t1); //---整数相除 在乘上10的平方 小数点的长度
}
2、加法方法
调用:addition(1,2);
function addition(a1,b1){
var r1,r2,m;
try{r1=a1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=b1.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (a1*m+b1*m)/m
}
3、乘法方法
调用:multiplication(2,2);
function multiplication(a1,b1){
var m=0,s1=a1.toString(),s2=b1.toString();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
4、减法方法
调用:subtraction(2,2);
function subtraction(a1,b1){
var r1,r2,m,n;
try{r1=a1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=b1.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2));
//动态控制精度长度
n=(r1>=r2)?r1:r2;
return ((a1*m-b1*m)/m).toFixed(n);
}