金额保留n位小数,及保留方式

金额保留n位小数,及计算方式(从保留位数后面开始计算,不使用千分位分隔符****

前端工作中经常遇到数字计算保留小数问题,由于不是四舍五入的方式不能使用toFixed函数,本文采用正则表达式匹配字符串的方式,解决对数字的向上或向下保留小数问题:
向上取整或向下取整从保留小数位开始处理数据

  • 参数
参数类型默认注释
sstring/Number金额
nstring/Number2保留小数位数
methodstring/Number0传入计算方式四色五入传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
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值