免得出现不知所谓的乘除错误,因为乘也许有精度难点

先放个长辈的稿子:JavaScript数字精度错失难题总计

javascript 数值运算精度

       
使用javascript实行数值运算的时候要极度小心和注意,因为javas的浮点数的精度难题很严重,例如44444.1+4.2的值并非想象中的44448.2,而是44448.299999999995
,同样对于乘法也有极大的难点,如55.7*12的值不是668.4,而是668.陆仟000000001
;固然学了有个别别样语言如C/C++,Java的都知情,即使也设有浮点数精度的难题,不过对于这种相比轻巧的总计,他们仍是能够够应付自如的,不会现出这么的不当,所以说在javascript上对于有个别小数的计量难点上依然得多留神,避防出现不知所谓的乘除错误。

认为本身尝试的部分列子:

<html> <head>     <title>js测试用例</title> </head> <body >     <script type="text/javascript">         var c = 4444.1;         var d = 4.2;         var e = c + d;         document.write(e.toFixed(1) + " || ");//这个值是正确的4448.3         var a = 44444.1;         var b = 4.2;         document.write(a + b + "   ||   "); //这个值就错误了,变为44448.299999999995          var f = 55.7;         var g = 12;         document.write(f * g);  //这个值就错误了,变为668.4000000000001      </script> </body> </html>

对此这几个标题,在和睦能够预言结果的景象下,能够试用一下数学函数实行部分创新,如

1、四舍五入函数,

   Math.round()

2、取小于或等于值a的最相仿整数函数

   Math.floor(a)

3、取大于或等于值a的非常小整数函数

   Math.ceil()

4、使用数值对象自己的点子,

   e.toFixed(n)//e为数值,n为保留小数位数,方法为保留n位小数 

等等。。。。。

版权注脚:本文为博主原创小说,未经博主允许不得转载。


今天遇见了19.99*100的标题,答案不等于1996,因为在javascript中浮点数的精打细算是以2进制总结的。自个儿写了一波消除措施(不可能只是的乘Math.pow(10,N)形成整数运算完再除掉,因为乘也是有精度难题,就如题面19.99*100不等于1999。):

function formatFloat(num1,num2){
    var str1 = num1.toString();
    var str2 = num2.toString();
    var c1 = str1.lastIndexOf(".")==-1?0:str1.lastIndexOf(".");
    var c2 = str2.lastIndexOf(".")==-1?0:str2.lastIndexOf(".");
    var n1 = str1.replace('.','');
    var n2 = str2.replace('.','');
    console.log(n1,n2);
    return parseInt(n1)*parseInt(n2)/Math.pow(10,c1+c2);
}
console.log(formatFloat(19.99,100));

这里把小数变整数的方法是用字符串方法去掉小数点。

下一场上网一查,本身的主意其实早就有哇,並且网络的更宏观,所以摘抄下来二个备用:

/** 
* 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 
* 
* @param num1加数1 | num2加数2 
*/ 
function numAdd(num1, num2) { 
var baseNum, baseNum1, baseNum2; 
try { 
baseNum1 = num1.toString().split(".")[1].length; 
} catch (e) { 
baseNum1 = 0; 
} 
try { 
baseNum2 = num2.toString().split(".")[1].length; 
} catch (e) { 
baseNum2 = 0; 
} 
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); 
return (num1 * baseNum + num2 * baseNum) / baseNum; 
}; 
/** 
* 加法运算,避免数据相减小数点后产生多位数和计算精度损失。 
* 
* @param num1被减数 | num2减数 
*/ 
function numSub(num1, num2) { 
var baseNum, baseNum1, baseNum2; 
var precision;// 精度 
try { 
baseNum1 = num1.toString().split(".")[1].length; 
} catch (e) { 
baseNum1 = 0; 
} 
try { 
baseNum2 = num2.toString().split(".")[1].length; 
} catch (e) { 
baseNum2 = 0; 
} 
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); 
precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2; 
return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision); 
}; 
/** 
* 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。 
* 
* @param num1被乘数 | num2乘数 
*/ 
function numMulti(num1, num2) { 
var baseNum = 0; 
try { 
baseNum += num1.toString().split(".")[1].length; 
} catch (e) { 
} 
try { 
baseNum += num2.toString().split(".")[1].length; 
} catch (e) { 
} 
return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum); 
}; 
/** 
* 除法运算,避免数据相除小数点后产生多位数和计算精度损失。 
* 
* @param num1被除数 | num2除数 
*/ 
function numDiv(num1, num2) { 
var baseNum1 = 0, baseNum2 = 0; 
var baseNum3, baseNum4; 
try { 
baseNum1 = num1.toString().split(".")[1].length; 
} catch (e) { 
baseNum1 = 0; 
} 
try { 
baseNum2 = num2.toString().split(".")[1].length; 
} catch (e) { 
baseNum2 = 0; 
} 
with (Math) { 
baseNum3 = Number(num1.toString().replace(".", "")); 
baseNum4 = Number(num2.toString().replace(".", "")); 
return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1); 
} 
};