您的位置:首页 > Web前端 > JavaScript

js浮点数值计算

2015-08-07 00:00 826 查看
摘要: js浮点数值计算

引:alert(0.1 + 0.2 == 0.3); // false

分析:浮点数值在js里存储的最高精度为17位小数,所以0.1+0.2=0.30000000000000004而不是0.3,实际上所有基于IEEE754的浮点计算都会存在误差,ECMAScript并非独此一家。

解决:将js的浮点计算转换为整型数值计算,如上可以用 (0.1*10 + 0.2*10)/10 = 0.3 来表示。

具体实现如下:

<script type="text/javascript">

// 两个浮点数求和
function accAdd(num1,num2){
var r1,r2,m;
try{
r1 = num1.toString().split('.')[1].length;
}catch(e){
r1 = 0;
}
try{
r2=num2.toString().split(".")[1].length;
}catch(e){
r2=0;
}
m=Math.pow(10,Math.max(r1,r2));

return Math.round(num1*m+num2*m)/m;
}

// 两个浮点数相减
function accSub(num1,num2){
var r1,r2,m;
try{
r1 = num1.toString().split('.')[1].length;
}catch(e){
r1 = 0;
}
try{
r2=num2.toString().split(".")[1].length;
}catch(e){
r2=0;
}
m=Math.pow(10,Math.max(r1,r2));
n=(r1>=r2)?r1:r2;
return (Math.round(num1*m-num2*m)/m).toFixed(n);
}
// 两数相除
function accDiv(num1,num2){
var t1,t2,r1,r2;
try{
t1 = num1.toString().split('.')[1].length;
}catch(e){
t1 = 0;
}
try{
t2=num2.toString().split(".")[1].length;
}catch(e){
t2=0;
}
r1=Number(num1.toString().replace(".",""));
r2=Number(num2.toString().replace(".",""));
return (r1/r2)*Math.pow(10,t2-t1);
}
//乘法
function accMul(num1,num2){
var m=0,s1=num1.toString(),s2=num2.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对象的原型增加方法,调用起来更加方便。
Number.prototype.add = function (arg) {
return accAdd(arg, this);
};
Number.prototype.sub = function (arg) {
return accSub(arg, this);
};
Number.prototype.mul = function (arg) {
return accMul(arg, this);
};
Number.prototype.div = function (arg) {
return accDiv(arg, this);
};
</script>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: