一、原因分析
在工作中遇到了關(guān)于金額的計(jì)算,用浮點(diǎn)數(shù)乘以100結(jié)果產(chǎn)生了一堆小數(shù)位。之前看過(guò)類(lèi)似的文章,卻沒(méi)有記錄下來(lái),總的來(lái)說(shuō)原因就是由于計(jì)算機(jī)計(jì)算會(huì)先把數(shù)字轉(zhuǎn)換成二進(jìn)制計(jì)算,然后在轉(zhuǎn)換為10進(jìn)制,導(dǎo)致精度丟失。今天記錄一下,以備不時(shí)之需。
二、方法封裝
加法
function add (num1, num2) {
if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return false;
var r1 = 0, r2 = 0;
try {
r1 = num1.toString().split(".")[1].length;
} catch (e) {
}
try {
r2 = num2.toString().split(".")[1].length;
} catch (e) {
}
var n = Math.pow(10, Math.max(r1, r2));
return (num1 * n + num2 * n) / n;}// 測(cè)試一下addition(306994.91, 306994.91);// 控制臺(tái)輸出:613989.82
方法中主要的部分是乘數(shù)和最后return的算法,如果不用封裝的話(huà),可以自己寫(xiě)一個(gè)比較大的數(shù)字,比如100000000,先把兩個(gè)加數(shù)分別乘以這個(gè)數(shù),這樣也可以計(jì)算正確,除非你知道你的數(shù)字范圍,否則不建議這樣做。
減法
function sub(num1, num2) {
if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
var r1 = 0, r2 = 0;
try {
r1 = num1.toString().split(".")[1].length;
} catch (e) {
}
try {
r2 = num2.toString().split(".")[1].length;
} catch (e) {
}
var m = Math.pow(10, Math.max(r1, r2));
return (num1 * m - num2 * m) / m;}
減法運(yùn)算的原理和加法一樣,都是先乘以較大的數(shù)字,不多介紹!
乘法
function mul(num1, num2) {
if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
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);}
乘法的計(jì)算主要是將數(shù)字轉(zhuǎn)換為整數(shù)相乘再除以10的N次冪
除法
function div(arg1, arg2) {
if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
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) {
}
r1 = Number(arg1.toString().replace(".", ""));
r2 = Number(arg2.toString().replace(".", ""));
return (r1 / r2) * Math.pow(10, t2 - t1);}
主要是先轉(zhuǎn)整型進(jìn)行計(jì)算再除以10的N次冪