/** * @description: 加法运算 * @param {*} arg1 * @param {*} arg2 * @param {*} number 展示小数点后位数 * @return {*} */ export function operationAdd(arg1, arg2, number = 2) { let l1 = 0, l2 = 0, m, c try { l1 = arg1.toString().split('.')[1].length } catch (e) {} try { l2 = arg2.toString().split('.')[1].length } catch (e) {} c = Math.abs(l1 - l2) m = Math.pow(10, Math.max(l1, l2)) if (c > 0) { let cm = Math.pow(10, c) if (l1 > l2) { arg1 = Number(arg1.toString().replace('.', '')) arg2 = Number(arg2.toString().replace('.', '')) * cm } else { arg1 = Number(arg1.toString().replace('.', '')) * cm arg2 = Number(arg2.toString().replace('.', '')) } } else { arg1 = Number(arg1.toString().replace('.', '')) arg2 = Number(arg2.toString().replace('.', '')) } const sum = (arg1 + arg2) / m let max = 0 try { max = sum.toString().split('.')[1].length } catch (error) {} return toFixedFun(sum, number) } /** * @description: 减法运算 * @param {*} arg1 * @param {*} arg2 * @param {*} number 展示小数点后位数 * @return {*} */ export function operationSub(arg1, arg2, number = 2) { let l1 = 0, l2 = 0, m, n try { l1 = arg1.toString().split('.')[1].length } catch (e) { l1 = 0 } try { l2 = arg2.toString().split('.')[1].length } catch (e) { l2 = 0 } m = Math.pow(10, Math.max(l1, l2)) //last modify by deeka //动态控制精度长度 n = l1 >= l2 ? l1 : l2 const sum = (arg1 * m - arg2 * m) / m let max = 0 try { max = sum.toString().split('.')[1].length } catch (error) {} return toFixedFun(sum, number) // return sum.toFixed(number); // return max > number ? sum.toFixed(number) : sum.toFixed(n); } /** * @description: 乘法运算 * @param {*} arg1 * @param {*} arg2 * @param {*} number 展示小数点后位数 * @return {*} */ export function operationMul(arg1, arg2, number = 2) { let m = 0, l1 = 0, l2 = 0, s1 = arg1.toString(), s2 = arg2.toString() try { m += s1.split('.')[1].length l1 = arg1.toString().split('.')[1].length } catch (e) { l1 = 0 } try { m += s2.split('.')[1].length l2 = arg2.toString().split('.')[1].length } catch (e) { l2 = 0 } const sum = (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m) let max = 0 try { max = sum.toString().split('.')[1].length } catch (error) {} return toFixedFun(sum, number) } /** * @description: 除法运算 * @param {*} arg1 * @param {*} arg2 * @param {*} number 展示小数点后位数 * @return {*} */ export function operationDiv(arg1, arg2, number = 2) { let l1 = 0, l2 = 0, r1, r2 try { l1 = arg1.toString().split('.')[1].length } catch (e) {} try { l2 = arg2.toString().split('.')[1].length } catch (e) {} r1 = Number(arg1.toString().replace('.', '')) r2 = Number(arg2.toString().replace('.', '')) const sum = (r1 / r2) * Math.pow(10, l2 - l1) let max = 0 try { max = sum.toString().split('.')[1].length } catch (error) {} return toFixedFun(sum, number) } /** *重写toFixed 解决四舍五入问题 * * @export * @param {*} data * @param {*} len */ export function toFixedFun(data, len) { const number = Number(data) if (isNaN(number) || number >= Math.pow(10, 21)) { return number.toString() } if (typeof len === 'undefined' || len === 0) { return Math.round(number).toString() } let result = number.toString() const numberArr = result.split('.') if (numberArr.length < 2) { // 整数的情况 return padNum(result) } const intNum = numberArr[0] // 整数部分 const deciNum = numberArr[1] // 小数部分 const lastNum = deciNum.substr(len, 1) // 最后一个数字 if (deciNum.length === len) { // 需要截取的长度等于当前长度 return result } if (deciNum.length < len) { // 需要截取的长度大于当前长度 1.3.toFixed(2) return padNum(result) } // 需要截取的长度小于当前长度,需要判断最后一位数字 result = `${intNum}.${deciNum.substr(0, len)}` if (parseInt(lastNum, 10) >= 5) { // 最后一位数字大于5,要进位 const times = Math.pow(10, len) // 需要放大的倍数 let changedInt = Number(result.replace('.', '')) // 截取后转为整数 changedInt++ // 整数进位 changedInt /= times // 整数转为小数,注:有可能还是整数 result = padNum(`${changedInt}`) } return result // 对数字末尾加0 function padNum(num) { const dotPos = num.indexOf('.') if (dotPos === -1) { // 整数的情况 num += '.' for (let i = 0; i < len; i++) { num += '0' } return num } else { // 小数的情况 const need = len - (num.length - dotPos - 1) for (let j = 0; j < need; j++) { num += '0' } return num } } }