java中四舍五入保留2位小数到底该用哪个方法?

写在前面

之前写过这方面代码,但没有记录又找不到了,只能花时间重新百度,坑啊!
遂记录下来这次测试结果。

返回值为double

public static <T extends Number> String getAvg(T left, T right, int bit) {
        if (left == null || right == null || right.doubleValue() == 0) {
            return null;
        }
        if (left.doubleValue() == 0) {
            return "0.00";
        }

        // 不用做判断是否left.intValue() == left.doubleValue()  BigDecimal的api中整数用doubleValue也可以
        BigDecimal leftBigDecimal =   new BigDecimal(left.doubleValue());
        BigDecimal rightBigDecimal = new BigDecimal(right.doubleValue());

        // double div = left.doubleValue() / right.doubleValue(); 有问题 23.65/10后变成2.36499
        //  必须指定小数位数,否则101/2会变成51
        //  必须指定为四舍五入(小数截断模式),否则无限循环小数会报错
        //  因爲leftBigDecimal23.64999 这种情况 所以保留位数+1
        BigDecimal divide = leftBigDecimal.divide(rightBigDecimal,bit+1,ROUND_HALF_UP);
        //保留2位小数(包括无效的0)
        return toRenDecimal(divide.floatValue());
    }

去除无效的0

    /**
     * 去除无效的0
     * 正则
     * 不处理科学计数法
     */
    public static String subZeroAndDot(String doubleStr) {
        if (null != doubleStr && doubleStr.indexOf(".") > 0) {
            //正则表达
            doubleStr = doubleStr.replaceAll("0+?$", "");//去掉后面无用的零
            doubleStr = doubleStr.replaceAll("[.]$", "");//如小数点后面全是零则去掉小数点
        }
        return doubleStr;
    }

或者

        return new BigDecimal(String.valueOf(v)).stripTrailingZeros().toPlainString();

需求

  1. 求百分比。即乘以100后再四舍五入,无效0不要。
  2. 四舍五入并保留2位小数。
    两者是不一样的!

测试用例

3/8: 37.5%

小数不能直接乘100

2、注意项:
可以自己再试下的。所以再求百分比的时候不能由保留4位的小数乘100,而是应该先乘100后再保留2位小数。

        System.out.println("0.25 x100="+0.25*100);
        System.out.println("0.28 x100="+0.28*100);

0.25 x100=25.0
0.28 x100=28.000000000000004

小数也不能直接除以10

比如四舍五入26.56/10 结果应该是26.6吧 但是结果是26.5!!
因为26.56/10结果是2.64444444

2、这方法不行啊

测试后 0.8012 保存是0.801啊!

public static String toStr(Double bitMapDataByAvg) {
    if (bitMapDataByAvg == null || bitMapDataByAvg.doubleValue() == 0) {
        return "0.00";
    }
    DecimalFormat decimalFormat = new DecimalFormat("0.00#");
    return decimalFormat.format(bitMapDataByAvg);
}

修改后如下,暂时可以的。
是否支持去除科学记数法再观察

public static String toRenDecimal(Double bitMapDataByAvg) {
    if (bitMapDataByAvg == null || bitMapDataByAvg.doubleValue() == 0) {
        return "0.00";
    }
    DecimalFormat decimalFormat = new DecimalFormat("0.00#");
    //不设置 则0.801会保存为0.801
    decimalFormat.setMinimumFractionDigits(2);
    decimalFormat.setMaximumFractionDigits(2);
    return decimalFormat.format(bitMapDataByAvg);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值