1. 前言
- 单个功能一篇发展也方便自己使用
- 加减乘除 是常见的功能,但是经常会遇到不精准的问题,
典型的比如 0.2+ 0.1 === 0.3 问题
2. 加法代码
// 加法封装 add(0.1, 0.2, 0.3, 0.4) => 1。可以传多个参数进行相加
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。相当于1 - 0.2 -0.3 -0.4;可以传多个参数,使用首位减后面的所有参数。
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 方法 获取小数位数在下面有写
4. 乘法
// 乘法ride(0.5, 0.6) => 3, 只允许传入两个参数。%计算可以这样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, 只允许传入两个参数。如果计算出现无穷数请后期根据需要修改最后代码进行取舍。
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. 获取小数位数
/*
* 获取小数位数
*/
getMaxDecimalLength(...val) {
// 最大小数位长度
let maxDecimalLength = 0;
val.forEach((x) => {
const strVal = x.toString(),
dotIndex = strVal.indexOf(".");
if (dotIndex > -1) {
// 获取当前值小数位长度
let curDecimalLength = strVal.length - 1 - dotIndex;
if (curDecimalLength > maxDecimalLength) {
maxDecimalLength = curDecimalLength;
}
}
});
return maxDecimalLength;
},
参考资料
初心
我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落
的崛起;
共勉