需求:浮点数精度导致的数值计算问题,需要对数值计算进行格式化处理,保留小数位为截取,不进行四舍五入
/**
* 带基数、后缀的数值格式化
* @param {*} num 源数据
* @param {*} base 特定的基数(比如100, 1000)
* @param {*} decimals 保留的小数位数(只截取不进位)
* @param {*} suffix 需要带的后缀
* @param {*} defaultStr 没数据时的默认值
*/
export const numDecimalsSuffix = (num, base, decimals, suffix, defaultStr) => {
if (isNaN(num) || (!num && num !== 0)) {
return defaultStr ? defaultStr : '--'
}
let tempNum = base ? Number(num) * base : Number(num)
let dec = decimals ? decimals : 2
const formatNum = (number, digit) => {
// pow() 方法可返回 x 的 y 次幂的值
let power = Math.pow(10, digit)
// 源数据为整数或者小数点后面小于decimals位的不处理
let pointIndex = String(number).indexOf('.') + 1 //获取小数点的位置 + 1
let pointCount = pointIndex ? String(number).length - pointIndex : 0 //获取小数点后的个数(需要保证有小数
// 默认为两位小数点
if (pointIndex === 0 || pointCount <= dec) {
return number
}
let realVal = ''
// 截取当前数据到小数点后decimals位
realVal = `${String(number).split('.')[0]}.${String(number).split('.')[1].substring(0, dec)}`
return Math.floor(realVal * power) / power
}
tempNum = formatNum(tempNum, dec)
// 判断截取之后数值是否为0
if (tempNum == 0) {
tempNum = 0
}
if (suffix) {
tempNum = `${tempNum}${suffix}`
}
return tempNum
}
eg: numDecimalsSuffix(1345.123, 1, 2, ' ', '--') ==> 1345.12
numDecimalsSuffix(1345.126, 1, 2, ' ', '--') ==> 1345.12
numDecimalsSuffix(0.1 + 0.2, 1, 2, ' %', '--') ==> 0.3%
numDecimalsSuffix(3.1799, 1, 2, ' %', '--')) ==> 3.17%
numDecimalsSuffix(3.17123, 100, 2, "%", "") ==> 317.12%