Js floating-point operations and js floating-point operations
Problem Introduction: today, when processing the phase multiplication of two numbers in front-end js, there is a precision deviation: 1.2*3 = 3.9999999995, which should have been 3.6. Baidu found this was a Bug in js floating point operations. I have found some rewriting methods for js floating-point operations on the Internet. I will summarize these methods for your reference.
Program code
1. Division functions
// Call: accDiv (arg1, arg2) // return value: precise result of dividing arg1 by 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 );}}
You can also expand the Number method and call it directly.
Number.prototype.div = function (arg){ return accDiv(this, arg);}
2. multiplication function
// Call: accMul (arg1, arg2) // return value: the exact result of multiplying arg1 by 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 )}
You can also expand the Number method and call it directly.
Number.prototype.mul = function (arg){ return accMul(arg, this);}
3. Addition Functions
// Call: accAdd (arg1, arg2) // return value: 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}
You can also expand the Number method and call it directly.
Number.prototype.add = function (arg){ return accAdd(arg,this);}
Hope to help you