资讯详情

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);
}

标签: 2x100k14继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台