发布网友 发布时间:2024-10-23 08:45
共1个回答
热心网友 时间:6分钟前
在IE8下是得到0.6的,在chrom 和Firefox下是0.6000000000000001。
其实这是js作浮点运算的一个bug,在JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的bit浮点格式存储number,按照IEEE 754的定义:
decimal对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。
解决方案:【注:以下代码并非原创】
(1).mul(0.2)+(2).mul(0.2)+0*0.6
script
//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
functionccAdd(arg1,arg2){
var1,r2,m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
returnarg1*m+arg2*m)/m
}
//给Number类型增加一个add方法,调用起来更加方便,以下类似
Number.prototype.addunctionarg){
returnccAdd(arg,this);
}
Number.prototype.mulunctionarg){
returnccMul(arg,this);
}
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
functionccMul(arg1,arg2)
{
var=0,s1=arg1.toString(),s2=arg2.toString();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
returnumber(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
Number.prototype.divunctionarg){
returnccDiv(arg,this);
}
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
functionccDiv(arg1,arg2){
var1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
returnr1/r2)*pow(10,t2-t1);
}
}
/script