-
-
Save creamidea/55688be5e094e6856b6db2b1457c495f to your computer and use it in GitHub Desktop.
JavaScript高精度计算
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的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 | |
//调用: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); | |
} | |
//乘法函数,用来得到精确的乘法结果 | |
//说明: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的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 | |
//调用: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); | |
} | |
//在你要用的地方包含这些函数,然后调用它来计算就可以了。 | |
//比如你要计算:7*0.8 ,则改成 (7).mul(8) | |
//其它运算类似,就可以得到比较精确的结果。 | |
//减法函数 | |
function Subtr(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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment