java 保留两位有效数字

 /**
   * 字符串转bigdecimal再转字符串
   *
   * @param number bigDecimal数字
   * @return bigDecimal数字字符串
   */
  public static String str2Str(String number) {
    // 无小数
    if (!number.contains(".")) {
      return number;
    } else {
      String[] split = number.split("\\.");
      // 有小数点无小数位
      if (ArrayUtil.isEmpty(split) || split.length == 1) {
        return split[0];
      } else {
        String b = split[1];
        // 小数位全为0
        String regex = "^[0]*$";
        Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
        Matcher matcher = pattern.matcher(b);
        if (matcher.find()) {
          return split[0];
        }
        // 存在非零
        // 整数位
        StringBuilder s1 = new StringBuilder(split[0]);
        s1.append(".");
        String[] split1 = b.split("");
        // 只有2位以内小数
        if (split1.length < 3) {
          return number;
        }
        // 大于两位小数
        // 有效数字位数
        int count = 0;
        // 末位数字
        StringBuilder last = new StringBuilder("0.");
        // 遍历计算每个数字
        for (String s : split1) {
          // 如果为0则拼接
          if ("0".equals(s)) {
            s1.append("0");
          }
          // 非零进行判断
          if (!"0".equals(s)) {
            // 如果非零数字个数小于2,直接拼接
            if (count < 2) {
              s1.append(s);
            } else {
              // 如果不小于于2
              // 获取当前位置值的大小,如果需要进位
              if (Integer.parseInt(s) > 4) {
                // 末位数字最后一位改成进位1
                String sub = StrUtil.sub(last, 0, last.length() - 1);
                last = new StringBuilder(sub + "1");
              }
              break;
            }
            count++;
          }
          last.append("0");
        }

        BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(s1));
        BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(last));
        return bigDecimal1.add(bigDecimal2).stripTrailingZeros().toPlainString();
      }
    }
  }

如果需要最后一位不把进位的0舍去,请在最后add处设置保留位数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值