js中为什么eval("1*0.2+2*0.2+0*0.6")的结果是0.6000000000000001呢?

JavaScript012

js中为什么eval("1*0.2+2*0.2+0*0.6")的结果是0.6000000000000001呢?,第1张

在IE8下是得到0.6的,在chrom 和Firefox下是0.6000000000000001。

其实这是js作浮点运算的一个bug,在JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的64bit浮点格式存储number,按照IEEE 754的定义:  

decimal64对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。

解决方案:【注:以下代码并非原创】

(1).mul(0.2)+(2).mul(0.2)+0*0.6

<script>

//加法函数,用来得到精确的加法结果

//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。

//调用:accAdd(arg1,arg2)

//返回值:arg1加上arg2的精确结果

function accAdd(arg1,arg2){

    var r1,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))

    return (arg1*m+arg2*m)/m

}

//给Number类型增加一个add方法,调用起来更加方便,以下类似

Number.prototype.add = function (arg){

    return accAdd(arg,this)

}

Number.prototype.mul = function (arg){

    return accMul(arg,this)

}

//乘法函数,用来得到精确的乘法结果

//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。

//调用:accMul(arg1,arg2)

//返回值:arg1乘以arg2的精确结果

function accMul(arg1,arg2)

{

    var m=0,s1=arg1.toString(),s2=arg2.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)

}

Number.prototype.div = function (arg){

    return accDiv(arg,this)

}

//除法函数,用来得到精确的除法结果

//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。

//调用:accDiv(arg1,arg2)

//返回值:arg1除以arg2的精确结果

function accDiv(arg1,arg2){

    var t1=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(".",""))

        return (r1/r2)*pow(10,t2-t1)

    }

}

</script>

<html>

<body>

<input id="vale" value="1"/>

</body>

<script type="text/javascript">

var vale=document.getElementById("vale").value

alert(eval(vale+1))

</script>

</html>

改成eval(vale+1),因为你的写法eval("vale+1")相当于拼接字符串了

希望采纳,谢谢