Created
October 21, 2012 13:04
-
-
Save binjoo/3926896 to your computer and use it in GitHub Desktop.
JAVASCRIPT:解决JS浮点数(小数)计算加减乘除的BUG
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
** 加法函数,用来得到精确的加法结果 | |
** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 | |
** 调用:accAdd(arg1,arg2) | |
** 返回值:arg1加上arg2的精确结果 | |
**/ | |
function accAdd(arg1, arg2) { | |
var r1, r2, m, c; | |
try { | |
r1 = arg1.toString().split(".")[1].length; | |
} | |
catch (e) { | |
r1 = 0; | |
} | |
try { | |
r2 = arg2.toString().split(".")[1].length; | |
} | |
catch (e) { | |
r2 = 0; | |
} | |
c = Math.abs(r1 - r2); | |
m = Math.pow(10, Math.max(r1, r2)); | |
if (c > 0) { | |
var cm = Math.pow(10, c); | |
if (r1 > r2) { | |
arg1 = Number(arg1.toString().replace(".", "")); | |
arg2 = Number(arg2.toString().replace(".", "")) * cm; | |
} else { | |
arg1 = Number(arg1.toString().replace(".", "")) * cm; | |
arg2 = Number(arg2.toString().replace(".", "")); | |
} | |
} else { | |
arg1 = Number(arg1.toString().replace(".", "")); | |
arg2 = Number(arg2.toString().replace(".", "")); | |
} | |
return (arg1 + arg2) / m; | |
} | |
//给Number类型增加一个add方法,调用起来更加方便。 | |
Number.prototype.add = function (arg) { | |
return accAdd(arg, this); | |
}; | |
/** | |
** 减法函数,用来得到精确的减法结果 | |
** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。 | |
** 调用:accSub(arg1,arg2) | |
** 返回值:arg1加上arg2的精确结果 | |
**/ | |
function accSub(arg1, arg2) { | |
var r1, r2, m, n; | |
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)); //last modify by deeka //动态控制精度长度 | |
n = (r1 >= r2) ? r1 : r2; | |
return ((arg1 * m - arg2 * m) / m).toFixed(n); | |
} | |
// 给Number类型增加一个mul方法,调用起来更加方便。 | |
Number.prototype.sub = 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类型增加一个mul方法,调用起来更加方便。 | |
Number.prototype.mul = function (arg) { | |
return accMul(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); | |
} | |
} | |
//给Number类型增加一个div方法,调用起来更加方便。 | |
Number.prototype.div = function (arg) { | |
return accDiv(this, arg); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment