1. 前言
- 單個功能一篇發(fā)展也方便自己使用
- 加減乘除 是常見的功能,但是經(jīng)常會遇到不精準(zhǔn)的問題,
典型的比如 0.2+ 0.1 === 0.3 問題
2. 加法代碼
// 加法封裝 add(0.1, 0.2, 0.3, 0.4) => 1访忿±舳觯可以傳多個參數(shù)進(jìn)行相加
const add = (...val)=> {
let max = 0;
let count = 0;
for (let i = 0; i < val.length; i++) {
const strVal = val[i].toString();
const index = strVal.indexOf(".");
let num = 0;
if (index > -1) {
num = strVal.length - 1 - index;
max = num > max ? num : max;
}
}
for (let i = 0; i < val.length; i++) {
count += Math.round(val[i] * Math.pow(10, max));
}
return count / Math.pow(10, max);
},
3. 減法
// 減法封裝 sub(1, 0.2, 0.3, 0.4) => 0.1。相當(dāng)于1 - 0.2 -0.3 -0.4;可以傳多個參數(shù),使用首位減后面的所有參數(shù)。
const sub = (...val) =>{
let sum,
maxDecimalLength = getMaxDecimalLength(...val);
val.forEach((x, index) => {
let nurVal = Math.round(x * Math.pow(10, maxDecimalLength));
if (index === 0) sum = nurVal;
else sum -= nurVal;
});
return sum / Math.pow(10, maxDecimalLength);
},
- getMaxDecimalLength 方法 獲取小數(shù)位數(shù)在下面有寫
4. 乘法
// 乘法ride(0.5, 0.6) => 3, 只允許傳入兩個參數(shù)。%計算可以這樣ride(0.5, 100) => 50奋构。
ride(...val) {
const strVal = val[0].toString();
const strValTwo = val[1].toString();
const index = strVal.indexOf(".");
const indexTwo = strValTwo.indexOf(".");
const num = [0, 0];
if (index > -1) {
num[0] = strVal.length - 1 - index;
}
if (indexTwo > -1) {
num[1] = strValTwo.length - 1 - index;
}
return (
Math.round(
val[0] * Math.pow(10, num[0]) * (val[1] * Math.pow(10, num[1]))
) / Math.pow(10, num[0] + num[1])
);
}
5. 除法
// 除法exc(0.5, 0.2) => 2.5, 只允許傳入兩個參數(shù)。如果計算出現(xiàn)無窮數(shù)請后期根據(jù)需要修改最后代碼進(jìn)行取舍拱层。
exc(val, valTwo = 100) {
const strVal = val.toString();
const strValTwo = valTwo.toString();
const index = strVal.indexOf(".");
const indexTwo = strValTwo.indexOf(".");
const num = [0, 0];
if (index > -1) {
num[0] = strVal.length - 1 - index;
}
if (indexTwo > -1) {
num[1] = strValTwo.length - 1 - index;
}
return (
Math.round(val * Math.pow(10, num[0])) /
(Math.round(valTwo * Math.pow(10, num[1])) *
Math.pow(10, num[0] - num[1]))
);
}
6. 獲取小數(shù)位數(shù)
/*
* 獲取小數(shù)位數(shù)
*/
getMaxDecimalLength(...val) {
// 最大小數(shù)位長度
let maxDecimalLength = 0;
val.forEach((x) => {
const strVal = x.toString(),
dotIndex = strVal.indexOf(".");
if (dotIndex > -1) {
// 獲取當(dāng)前值小數(shù)位長度
let curDecimalLength = strVal.length - 1 - dotIndex;
if (curDecimalLength > maxDecimalLength) {
maxDecimalLength = curDecimalLength;
}
}
});
return maxDecimalLength;
},
參考資料
初心
我所有的文章都只是基于入門弥臼,初步的了解;是自己的知識體系梳理,如有錯誤,道友們一起溝通交流;
如果能幫助到有緣人,非常的榮幸,一切為了部落
的崛起;
共勉