金额保留n位小数,及计算方式(从保留位数后面开始计算,不使用千分位分隔符****
前端工作中经常遇到数字计算保留小数问题,由于不是四舍五入的方式不能使用toFixed函数,本文采用正则表达式匹配字符串的方式,解决对数字的向上或向下保留小数问题:
向上取整或向下取整从保留小数位开始处理数据
- 参数
参数 | 类型 | 空 | 默认 | 注释 |
---|---|---|---|---|
s | string/Number | 否 | 金额 | |
n | string/Number | 2 | 保留小数位数 | |
method | string/Number | 0 | 传入计算方式四色五入传0,向下取整传2,向上取整传1 |
AMONTDECIMAL(s,n=2,method=0) {
// 保留方案:四色五入,向下取整,向上取整......
if(method===0) {//四色五入
s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + ""; //四舍五入replace处理出现多次.的问题
return s
} else if (method===1) {//向上取整
// a为原数字,n是保留的小数位数
let result = '0'
if (Number(s) && n > 0) { // 简单的做个判断
n = +n || 2
s = s + ''
if (/e/.test(s)) { // 如果是包含e字符的数字直接返回
result = s
} else if (!/\./.test(s)) { // 如果没有小数点
result = s + `.${Array(n + 1).join('0')}`
} else { // 如果有小数点
s =s + `${Array(n + 1).join('0')}`
let reg = new RegExp(`-?\\d*\\.\\d{0,${n}}`)
let floorStr = reg.exec(s)[0]
if (+floorStr >= +s) {
result = floorStr
} else {
let floorNumber = +floorStr + +`0.${Array(n).join('0')}1`
let point = /\./.test(floorNumber + '') ? '' : '.'
let floorStr2 = floorNumber + point + `${Array(n + 1).join('0')}`
result = reg.exec(floorStr2)[0]
}
}
}
return result
} else if (method===2) {//向下取整
// s为原数字,n是保留的小数位数
let result = '0'
if (Number(s) && n > 0) { // 简单的做个判断
n = +n || 2
s = s + ''
if (/e/.test(s)) { // 如果是包含e字符的数字直接返回
result = s
} else if (!/\./.test(s)) { // 如果没有小数点
result = s + `.${Array(n + 1).join('0')}`
} else { // 如果有小数点
s = s + `${Array(n + 1).join('0')}`
let reg = new RegExp(`-?\\d*.\\d{0,${n}}`)
result = reg.exec(s)[0]
}
}
return result
}
}