js 在前端实际开发中,进行前端计算及社保公积金核算会出现丢失精度的问题,项目中需要对金钱进行运算

今天因为项目需要做社保公积金缴纳金额得核算,所以在前端计算需要十分精确并且需要对所得计算金额进行一些计算规则的处理(四舍五入到角,见分进角,全舍到角…),因此引用了bigDecimal工具来实现

bigDecimal: Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算 需要的可以自行百度
下面直接上代码-----

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="mathcontext.js"></script>
  <script src="bigdecimal.js"></script>
</head>
<body>
<script>
  function test(decimalRule,d){
    if ("01sswrtoyuan".includes(decimalRule)) {
//			01sswrtoyuan	四舍五入到元	四舍五入到元	保留0位小数
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(0, MathContext.prototype.ROUND_HALF_UP).toString() + '.00';
      return f1;
    } else if ("02sswrtojiao".includes(decimalRule)) {
//			02sswrtojiao	四舍五入到角	四舍五入到角	保留1位小数
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(1, MathContext.prototype.ROUND_HALF_UP).toString() + '0';
      return f1;
    } else if ("03sswrtofen".includes(decimalRule)) {
//			03sswrtofen	四舍五入到分	四舍五入到分	保留2位小数
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(2, MathContext.prototype.ROUND_HALF_UP).toString();
      return f1;
    } else if ("04sswrtoli".includes(decimalRule)) {
//			04sswrtoli	四舍五入到厘	四舍五入到厘	保留3位小数
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(3, MathContext.prototype.ROUND_HALF_UP).toString();
      return f1;
    } else if ("05jjjy".includes(decimalRule)) {
//			05jjjy	见角进元	见角进元	保留0位小数
      let bg = new BigDecimal(d);
      let isSum = '1'
      if (d.split('.')[1]) {
        isSum = d.split('.')[1].substring(0, 1)
      } else {
        isSum = '1'
      }
      let f1 = 0;
      if ("0".includes(isSum)){
        f1 = bg.setScale(0, MathContext.prototype.ROUND_HALF_UP).toString() + '.00';
      } else {
        f1 = bg.setScale(0, MathContext.prototype.ROUND_UP).toString()  + '.00';
      }
      return f1;
    } else if ("06jfjj".includes(decimalRule)) {
//			06jfjj	见分进角	见分进角	保留1位小数
      let bg = new BigDecimal(d);
      let f1 = 0;
      let isSum = '1'
      if (d.split('.')[1]) {
        isSum = d.split('.')[1].substring(1, 2)
      } else {
        isSum = '1'
      }
      if ("0".includes(isSum)){
        f1 = bg.setScale(1, MathContext.prototype.ROUND_DOWN).toString() + '0';
      } else {
        f1 = bg.setScale(1, MathContext.prototype.ROUND_UP).toString() + '0';
      }
      return f1;
    } else if ("07jljf".includes(decimalRule)) {
//			07jljf	见厘进分	见厘进分	保留2位小数
      let bg = new BigDecimal(d);
      let f1 = 0;
      let isSum = '1'
      if (d.split('.')[1]) {
        isSum = d.split('.')[1].substring(2, 3)
      } else {
        isSum = '1'
      }
      if ("0".includes(isSum)){
        f1 = bg.setScale(2, MathContext.prototype.ROUND_DOWN).toString();
      } else {
        f1 = bg.setScale(2, MathContext.prototype.ROUND_UP).toString();
      }
      return f1;
    } else if ("08jhjl".includes(decimalRule)) {
//			08jhjl	见毫进厘	见毫进厘	保留3位小数
      let bg = new BigDecimal(d);
      let f1 = 0;
      let isSum = '1'
      if (d.split('.')[1]) {
        isSum = d.split('.')[1].substring(3, 4)
      } else {
        isSum = '1'
      }
      if ("0".includes(isSum)){
        f1 = bg.setScale(3, MathContext.prototype.ROUND_DOWN).toString();
      } else {
        f1 = bg.setScale(3, MathContext.prototype.ROUND_UP).toString();
      }
      return f1;
    } else if ("09qstoyuan".includes(decimalRule)) {
//			09qstoyuan	全舍到元	全舍到元	保留0位小数.
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(0, MathContext.prototype.ROUND_DOWN).toString() + '.00';
      return f1;

    } else if ("10qstojiao".includes(decimalRule)) {
//			10qstojiao	全舍到角	全舍到角	保留1位小数
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(1, MathContext.prototype.ROUND_DOWN).toString()  + '0';
      return f1;
    } else if ("11qstofen".includes(decimalRule)) {
//			11qstofen	全舍到分	全舍到分	保留2位小数
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(2, MathContext.prototype.ROUND_DOWN).toString();
      return f1;
    } else if ("12qstoli".includes(decimalRule)) {
//			12qstoli	全舍到厘	全舍到厘	保留3位小数
      let bg = new BigDecimal(d);
      let f1 = bg.setScale(3, MathContext.prototype.ROUND_DOWN).toString();
      return f1;
    }

  }
  console.log(test('01sswrtoyuan', '1.61'))
  console.log(test('02sswrtojiao', '1.62'))
  console.log(test('03sswrtofen', '9.99'))
  console.log(test('04sswrtoli', '1.65756'))
  console.log(test('05jjjy', '1.65'))
  console.log(test('05jjjy', '1.05'))
  console.log(test('06jfjj', '215.27'))
  console.log(test('06jfjj', '100.820'))
  console.log(test('06jfjj', '100.821'))
  console.log(test('07jljf', '100.820'))
  console.log(test('07jljf', '100.821'))
  console.log(test('07jljf', '1.1'))
  console.log(test('08jhjl', '1.0000'))
  console.log(test('08jhjl', '1.0007'))
  console.log(test('09qstoyuan', '9.123'))
  console.log(test('10qstojiao', '19.123'))
  console.log(test('11qstofen', '12.123'))
  console.log(test('12qstoli', '12.12398'))
</script>
</body>
</html>

/*
	只要见角进元 见分进角 见厘进分 见毫进厘  需要做特殊处理 
	在当前的位判断是否为0 为0舍去 不为0向前进一
*/

注意: 需要引入bigDecimal的js文件链接自行下载
https://download.csdn.net/download/qq_37041819/12023936 https://download.csdn.net/download/qq_37041819/12023943

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜天生i

如果本文对你有所帮助点赞就好~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值