【JavaScript】js中的小数计算学问大-》注意误差

在js中,带小数的数据相加或相乘时总会出现好多位小数。例如100.11+100.02=200.130000001类似的情况。这是因为在js中浮点数的计算是以2进制算的,解决方法一般是将小数化成整数后再作除法。如上例中:(100.01*100+100.02*100)/100 。

以下是可用的JS小数计算函数和例子:

<form name="inputform">

<input type="text" name="a1">

<input type="text" name="a2">

<input type="button" value="累加" onclick="add()">

</form>

<script>

function add()

{

var num1=parseFloat(document.getElementsByName("a1")[0].value);

var num2=parseFloat(document.getElementsByName("a2")[0].value);

document.getElementsByName("a1")[0].value=yunshuan(num1,"*",num2);

}

function yunshuan(a,how,b){//正确浮点运算

if(a.toString().indexOf(".") < 0 && b.toString().indexOf(".") < 0){//没小数

return eval(a + how + b);

}

//至少一个有小数

var alen = a.toString().split(".");

if(alen.length == 1){//没有小数

alen = 0;

}else {

alen = alen[1].length;

}

var blen = b.toString().split(".");

if(blen.length == 1){

blen = 0;

}else {

blen = blen[1].length;

}

if(blen > alen)alen = blen;

blen = "1";

for(;alen > 0; alen--){//创建一个相应的倍数

blen = blen + "0";

}

switch(how){

case "+":

return (a * blen + b * blen) / blen;

break;

case "-":

return (a * blen - b * blen) / blen;

break;

case "*":

return ((a * blen) * (b * blen)) / (blen * blen);

break;

default:

alert("你要求的\t" + how + "\t运算未完成!");

return eval(a + how + b);

}

}

</script>