我的代碼有多短,本文章就有多短饱溢!(?_?)
※ 思路分析
對于整數(shù)的運算喧伞,不會出錯;而帶了小數(shù)點的運算绩郎,直接計算容易出錯潘鲫。推薦的做法是,帶了小數(shù)點的計算肋杖,都要經(jīng)過處理溉仑。
因此,對于帶小數(shù)的加状植、減浊竟、乘、除運算津畸,先變?yōu)檎麛?shù)的運算振定,再將得到的結(jié)果變回去(由中間值處理),得到最終的結(jié)果肉拓。
一后频、加法運算
1. 先看直接計算:
console.log(0.1 + 0.2);
// 打印結(jié)果 0.30000000000000004
2. 代碼實現(xiàn)
function calcPlus(num1, num2) {
let l1, l2, m;
try {
l1 = num1.toString().split(".")[1].length;
} catch(e) {
l1 = 0;
}
try {
l2 = num2.toString().split(".")[1].length;
} catch(e) {
l2 = 0;
}
m = Math.pow(10, Math.max(l1, l2));
return (num1 * m + num2 * m) / m;
}
console.log(0.1 + 0.2, calcPlus(0.1, 0.2));
// 輸出: 0.30000000000000004 0.3
代碼解析:
m:得到小數(shù)點的位數(shù)的最大值,并10的次方得到中間值帝簇;
m=10徘郭,因此計算式為:(0.1 * 10 + 0.2 * 10) / 10 = (1 + 2) / 10 = 3 / 10 = 0.3
二靠益、減法運算
1. 先看直接計算:
console.log(1.0 - 0.9);
// 輸出: 0.09999999999999998
2. 代碼實現(xiàn)
function calcSubtract(num1, num2) {
let l1, l2, m;
try {
l1 = num1.toString().split(".")[1].length;
} catch(e) {
l1 = 0;
}
try {
l2 = num2.toString().split(".")[1].length;
} catch(e) {
l2 = 0;
}
m = Math.pow(10, Math.max(l1, l2));
return (num1 * m - num2 * m) / m;
}
console.log(1.0 - 0.9, calcSubtract(1.0, 0.9));
// 輸出: 0.09999999999999998 0.1
代碼解析:
m:得到小數(shù)點的位數(shù)的最大值,并10的次方得到中間值残揉;
m==10胧后,因此計算式為:(1.0 * 10 - 0.9 * 10) / 10 = (10 - 9) / 10 = 1 / 10 = 0.1
三、乘法運算
1. 先看直接計算:
console.log(19.9 * 100);
// 輸出:1989.999999999999
2. 代碼實現(xiàn)
function calcMultiply(num1, num2) {
let m = 0;
try {
m += num1.toString().split(".")[1].length;
} catch(e) {}
try {
m += num2.toString().split(".")[1].length;
} catch(e) {}
return (Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", ""))) / Math.pow(10, m);
}
console.log(19.9 * 100, calcMultiply(19.9, 100));
// 輸出:1989.9999999999998 1990
代碼解析:
m:得到小數(shù)點的最大的位數(shù)抱环;
因此計算式為:(199 * 100) / = 19900 / 10 = 1990
四壳快、除法運算
1. 先看直接計算:
console.log(6.6 / 0.2);
// 輸出:32.99999999999999
2. 代碼實現(xiàn)
function calcDivide(num1, num2) {
let l1 = 0, l2 = 0, n1, n2;
try {
l1 = num1.toString().split(".")[1].length;
} catch(e) {}
try {
l2 = num2.toString().split(".")[1].length;
} catch(e) {}
n1 = Number(num1.toString().replace(".", ""));
n2 = Number(num2.toString().replace(".", ""));
return (n1 / n2) * Math.pow(10, l2 - l1);
}
console.log(6.6 / 0.2, calcDivide(6.6, 0.2));
// 輸出:32.99999999999999 33
代碼解析:
n1,n2:去除小數(shù)點,即變?yōu)檎麛?shù)
l2-l1:位數(shù)差镇草,即中間值
因此計算式為:(66 / 2) * = 33 * 1 = 33