近期涉及到小数运算,在网上扒拉到类似很多这类的方法,刚开始使用没发现问题
直到输入1111.11*100=111110.99999999999
好吧,只能自己改造一下了
/**
* 小数计算
* @param {*} num1 数字1
* @param {*} num2 数字2
* @param {*} symbol +-*\/符号
* @returns
*/
export function decimalCalculation(num1, num2, symbol) {
const _number1 = _processingData(num1)
const _number2 = _processingData(num2)
const maxDigit = Math.max(_number1.digit, _number2.digit)
const step = Math.pow(10, maxDigit)
let result
switch (symbol) {
case '+':
result = (_multiplication(_number1.split, maxDigit) + _multiplication(_number2.split, maxDigit)) / step
break
case '-':
result = (_multiplication(_number1.split, maxDigit) - _multiplication(_number2.split, maxDigit)) / step
break
case '*':
result = (_multiplication(_number1.split, maxDigit) * _multiplication(_number2.split, maxDigit)) / step / step
break
case '/':
result = _multiplication(_number1.split, maxDigit) / _multiplication(_number2.split, maxDigit)
break
default:
break
}
// 拆分小数,计算位数
function _processingData(num) {
const str = num.toString()
const split = str.split('.')
let digit = 0
if (split[1]) {
digit = split[1].length
} else {
split[1] = ''
}
return { str, split, digit }
}
// 字符串组装完成乘法运算,js* 1111.11*100会出现问题
function _multiplication(num, digit) {
return Number(num[0] + num[1].padEnd(digit, 0))
}
return result
}
可直接食用,下边附赠一份数字转汉字
// 阿拉伯数字转换大写
export function ToLower(str, capital = true) {
const STR = String(str).split('.')
let len = STR[0].length - 1
if (STR[0] == 0) {
return '零'
}
let idxs = ['', '拾', '百', '千', '万', '拾', '百', '千', '亿', '拾', '百', '千', '万', '拾', '百', '千', '亿']
let num = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
if (!capital) {
idxs = ['', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千', '万', '十', '百', '千', '亿']
num = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
}
const integer = STR[0].replace(/([1-9]|0+)/g, function ($, $1, idx, full) {
let pos = 0
if ($1[0] != '0') {
pos = len - idx
if (idx == 0 && $1[0] == 1 && idxs[len - idx] == '十') {
return idxs[len - idx]
}
return num[$1[0]] + idxs[len - idx]
} else {
let left = len - idx
let right = len - idx + $1.length
if (Math.floor(right / 4) - Math.floor(left / 4) > 0) {
pos = left - (left % 4)
}
if (pos) {
return idxs[pos] + num[$1[0]]
} else if (idx + $1.length >= len) {
return ''
} else {
return num[$1[0]]
}
}
})
if (STR.length > 1) {
const decimal = STR[1].replace(/([1-9]|0+)/g, function ($, $1, idx, full) {
return num[$1[0]]
})
return integer + '点' + decimal
} else {
return integer
}
}