export const toNewFixed = (num, digit = 2) => {
const multiplePow = Math.pow(10, digit); // 多乘一位防止相乘后有小数点导致精度丢失,如:17.865
return Math.round((num * (multiplePow * 10)) / 10) / multiplePow;
// return Math.round(+num + 'e' + digit) / multiplePow
};
export const toFixedNum = (num, len = 2, str = "--") => {
if ((num || num === 0) && !isNaN(num)) {
return toNewFixed(num, len).toFixed(len); // toFixed 四舍五入有问题 用只于补0,如25.615.toFixed(2)='25.61'
}
return num || str;
};
// 相乘
export function multiplicationFn(mulArr = [], decimal, showType = 'number') {
let decLen = 0; // 相乘数的小数点总长度
let tNum = 1; // 相乘后的总数
mulArr.forEach(ele => {
const valArr = (ele || 0).toString().split('.');
decLen += valArr[1] ? valArr[1].length : 0;
tNum = tNum * valArr.join(''); // 转换成整数
})
const multiplePow = Math.pow(10, decLen)
tNum = tNum / multiplePow
if (decimal || decimal === 0) {
return showType === 'string' ? toFixedNum(tNum, decimal) : toNewFixed(tNum, decimal)
}
return Number(tNum)
}
// 多个数值相除
export function beDividedFn(divideArr = [], decimal, showType = 'number') {
if (divideArr.some(e => !e)) {
return ''; // 除数或被除数为0或无值时返回空
}
let sNum = divideArr.splice(0, 1)[0] || 0; // 被除数,初始值为数组的第一个值
const divisorNum = divideArr.length > 1 ? multiplicationFn(divideArr) : divideArr[0]; // 除数
const nDivideArr = [sNum, divisorNum]
const decimalArr = nDivideArr.map(n => {
const valArr = (n || 0).toString().split('.');
return valArr[1] ? valArr[1].length : 0;
})
// 获取最大的小数点长度
const maxDecimal = Math.max.apply(null, decimalArr);
const subPow = Math.pow(10, maxDecimal);
sNum = Math.round(sNum * subPow);
sNum = sNum / Math.round(divisorNum * subPow);
if (decimal || decimal === 0) {
return showType === 'string' ? toFixedNum(sNum, decimal) : toNewFixed(sNum, decimal)
}
return Number(sNum)
}
// 相加
export function accumulationFn(addArr = [], decimal) {
let tNum = 0; // 相加后的总数
if (!addArr.length) {
return tNum;
}
const decimalArr = addArr.map(n => {
const valArr = (n || 0).toString().split('.');
return valArr[1] ? valArr[1].length : 0;
})
// 获取最大的小数点长度
const maxDecimal = Math.max.apply(null, decimalArr);
const addPow = Math.pow(10, maxDecimal);
addArr.forEach(ele => {
tNum += Math.round((ele || 0) * addPow);
})
tNum = tNum / addPow;
if (decimal || decimal === 0) {
return toFixedNum(tNum, decimal) // 不与后台交互,仅作页面显示用,如小计数据
}
return Number(tNum)
}
// 相减
export function subtractFn(subArr = [], decimal) {
const decimalArr = subArr.map(n => {
const valArr = (n || 0).toString().split('.');
return valArr[1] ? valArr[1].length : 0;
})
// 获取最大的小数点长度
const maxDecimal = Math.max.apply(null, decimalArr);
const subPow = Math.pow(10, maxDecimal);
let sNum = subArr.splice(0, 1)[0] || 0; // 相减的数,初始值为数组的第一个值
sNum = Math.round(sNum * subPow);
subArr.forEach(ele => {
sNum -= Math.round((ele || 0) * subPow);
})
sNum = sNum / subPow;
if (decimal || decimal === 0) {
return toFixedNum(sNum, decimal)
}
return Number(sNum)
}