js 中加减乘除 比较精确的算法,js本身有些运算会出错,这里给出较精确的算法
问题这样的:
37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)
我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998
怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。
比如:7*0.8 JavaScript算出来就是:5.6000000000000005
网上找到了一些解决办法,就是重新写了一些浮点运算的函数。
下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <script type="text/javascript"> //加法函数,用来得到精确的加法结果 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); } //乘法函数,用来得到精确的乘法结果 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); } ///除法函数,用来得到精确的除法结果 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); } //制保留2位小数,如:2,会在2后面补上00.即2.00 function toDecimal2(x) { var f = parseFloat(x); if(isNaN(f)) { return false; } var f = Math.round(x * 100) / 100; var s = f.toString(); var rs = s.indexOf('.'); if(rs < 0) { rs = s.length; s += '.'; } while(s.length <= rs + 2) { s += '0'; } return s; } console.log(accAdd(1.01, 1.12) + '--------加') console.log(accMul(1.01, 1.12) + '--------乘法') console.log(accDiv(1.01, 1.12) + '--------除法') console.log(toDecimal2(1.0569) + '---------保留2位小数') </script> </body> </html>
如果真的不知道将来要做什么,索性就先做好眼前的事情。只要今天比昨天过得好,就是进步。长此以往,时间自然会还你一个意想不到的未来。
生活像一个杯子。一开始,里面是空的,之后,要看你怎么对待它。如果你只往不如意的方面想,那么你最终辉得到一杯苦水。如果你往好的方面想,那么你最终会得到一杯清泉。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
生活像一个杯子。一开始,里面是空的,之后,要看你怎么对待它。如果你只往不如意的方面想,那么你最终辉得到一杯苦水。如果你往好的方面想,那么你最终会得到一杯清泉。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。