对金钱金额的处理--每三位间隔‘,‘,末尾保留两位小数

对金钱金额的处理–每三位间隔’,’,末尾保留两位小数

由于项目的原因,最近遇到在下单时需要对金额进行特殊处理,我的需求是:当折扣不足0.01元时,不计入折扣。也就是这部分由客户自行承担。

朋友给我分享了他们公司的coding,虽不满足我的需求,但是对金额的处理是每隔三位一个,,末尾保留两位小数,先mark一下:

1 放在watch

housePrice (newVal) {
  newVal = newVal.substring(0, 18)
  let temp = []
  temp = newVal.split('.')
  if (temp.length === 1 && temp[0] === '') {
    this.housePrice = ''
  } else if (temp.length === 1 && temp[0] !== '' && temp[0].length > 1) {
    if (temp[0].slice(0, 1) === '0') {
      let l = temp[0].length
      temp[0] = temp[0].slice(1, l)
    }
    this.housePrice = temp.join('.')
  } else if (temp.length === 2 && temp[0] === '') {
    temp[0] = '0'
    this.housePrice = temp.join('.')
  } else if (temp.length === 2 && temp[1].length > 2) {
    temp[1] = temp[1].slice(0, 2)
    this.housePrice = temp.join('.')
  }
  return this.housePrice
},

2.对数据进行除100操作后再处理

Vue.filter('filterMoneyDiv100', (value) => {
  if (value === 0 || value === '0') {
    return '0.00'
  } else if (value === '') {
    return ''
  } else if (value && value !== 0) {
    value = value / 100
    value = value.toString()
    let reg = /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
    if (reg.test(value)) {
      let n = !isFinite(+value) ? 0 : parseFloat(value)
      let prec = 2
      let sep = ','
      let dec = '.'
      let s = ''
      let toFixedFix = function (n, prec) {
        let k = Math.pow(10, prec)
        return '' + Math.round(n * k) / k
      }
      s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
      var re = /(-?\d+)(\d{3})/
      while (re.test(s[0])) {
        s[0] = s[0].replace(re, '$1' + sep + '$2')
      }
      if ((s[1] || '').length < prec) {
        s[1] = s[1] || ''
        s[1] += new Array(prec - s[1].length + 1).join('0')
      }
      return s.join(dec)
    } else {
      return value
      }
  }
})

3.对数据进行乘以100 后再操作

Vue.filter('filterMoney', (value) => {
  if (value && value !== 0) {
    value = value.toString()
    let reg = /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
    if (reg.test(value)) {
      let n = !isFinite(+value) ? 0 : parseFloat(value)
      let prec = 2
      let sep = ','
      let dec = '.'
      let s = ''
      let toFixedFix = function (n, prec) {
        let k = Math.pow(10, prec)
        return '' + Math.round(n * k) / k
      }
      s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
      var re = /(-?\d+)(\d{3})/
      while (re.test(s[0])) {
        s[0] = s[0].replace(re, '$1' + sep + '$2')
      }
      if ((s[1] || '').length < prec) {
        s[1] = s[1] || ''
        s[1] += new Array(prec - s[1].length + 1).join('0')
      }
      return s.join(dec)
    } else {
      return value
    }
  } else if (value === 0) {
    return '0.00'
  }
})

4.若小数的第三位数直接舍弃,而不是进行四舍五入,则使用以下方法

moneyVal (val) {
	if (val && val != 0) {
		val = Math.floor(val * 100) / 100
		return val.toFixed(2) // 最后使用toFixed修饰下
	} else {
		return '0.00'
	}
}

注意:
该方法在val 值为2.01时,输出是2.00,这个需要在使用时尽量避开,使得不进此方法。

### 回答1: Java 8 中,可以使用 BigDecimal 类来处理高精度的小数除法。可以使用 setScale() 方法来保留小数位数,并使用 RoundingMode 来设置舍入模式。 例如,如果要将除法结果保留三位小数,并且使用四舍五入进位,可以使用以下代码: ``` BigDecimal a = new BigDecimal("5"); BigDecimal b = new BigDecimal("3"); BigDecimal c = a.divide(b, 3, RoundingMode.HALF_UP); System.out.println(c); ``` 在这个例子中,a 除以 b 的结果将保留三位小数,并使用四舍五入进位。 注意:如果 b 是 0,那么 divide() 方法会抛出 ArithmeticException 异常。 ### 回答2: 在Java 8中,可以使用BigDecimal进行除法运算并保留三位小数。如果希望对除法结果的小数进行进位处理,可以使用setScale()方法来设置小数位数,并使用RoundingMode.UP进行进位处理。 具体步骤如下: 1. 首先,创建两个BigDecimal对象,表示除法的被除数和除数,例如: ```java BigDecimal dividend = new BigDecimal("10"); BigDecimal divisor = new BigDecimal("3"); ``` 2. 然后,使用divide()方法进行除法运算,将结果赋值给一个新的BigDecimal对象,例如: ```java BigDecimal result = dividend.divide(divisor); ``` 3. 接下来,使用setScale()方法设置小数位数为三位,并使用RoundingMode.UP进行进位处理,例如: ```java result = result.setScale(3, RoundingMode.UP); ``` 4. 最后,可以通过调用toString()方法将BigDecimal对象转换为字符串,并输出最终结果,例如: ```java System.out.println(result.toString()); ``` 以上代码的输出结果将是保留三位小数并进行进位处理后的除法结果。 需要注意的是,在使用BigDecimal进行除法运算时,可能会出现除不尽的情况,这时需要根据业务需求来确定是否需要进行进位处理。如果不需要进位处理,可以使用其他的舍入模式,如RoundingMode.DOWN等。 ### 回答3: 在Java 8中,我们可以使用BigDecimal类进行除法运算并保留三位小数。但是要注意,由于除法运算可能会导致无限小数位数的结果,我们需要进行进位处理。 首先,我们需要创建两个BigDecimal对象,用于表示被除数和除数。然后,使用BigDecimal的divide方法进行除法运算,将结果存储在一个新的BigDecimal对象中: BigDecimal dividend = new BigDecimal("10"); // 设置被除数为10 BigDecimal divisor = new BigDecimal("3"); // 设置除数为3 BigDecimal result = dividend.divide(divisor); // 进行除法运算 接下来,我们可以使用setScale方法设置结果的小数位数为三位,并指定进位模式为向上取整,以确保得到正确的结果: result = result.setScale(3, RoundingMode.CEILING); 最后,我们可以使用toString方法将结果转换为字符串,并输出结果: System.out.println(result.toString()); 这样,我们就可以得到一个保留三位小数并进行了进位处理的结果。注意,如果结果的小数位数少于三位,setScale方法将自动在末尾补零。 以上就是使用Java 8的BigDecimal类进行除法运算、保留三位小数并进行进位处理的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值