Java NumberFormat舍入模式,为什么将上半格式1.015更改为1.01而不是1.02

时间:2019-10-31 01:58:19

标签: java number-formatting

Java代码

@Test
void a() {
    NumberFormat format = DecimalFormat.getInstance(Locale.CHINA);
    format.setMaximumFractionDigits(2);
    format.setMinimumFractionDigits(2);
    format.setCurrency(Currency.getInstance(Locale.CHINA));
    for (RoundingMode mode : RoundingMode.values()) {
        if(mode == RoundingMode.UNNECESSARY) continue;
        format.setRoundingMode(mode);
        System.out.println("Rounding mode: " + mode);
        System.out.println("--------------------------------------------------------");
        System.out.println("\t format 1.014 is " + format.format(1.014));
        System.out.println("\t format 1.015 is " + format.format(1.015));
        System.out.println("\t format 1.016 is " + format.format(1.016));
        System.out.println();
    }
}

结果:

环绕模式:UP

 format 1.014 is 1.02
 format 1.015 is 1.02
 format 1.016 is 1.02

环绕模式:DOWN

 format 1.014 is 1.01
 format 1.015 is 1.01
 format 1.016 is 1.01

环绕模式:天花板

 format 1.014 is 1.02
 format 1.015 is 1.02
 format 1.016 is 1.02

环绕模式:地板

 format 1.014 is 1.01
 format 1.015 is 1.01
 format 1.016 is 1.01

环绕模式:HALF_UP

 format 1.014 is 1.01
 format 1.015 is 1.01
 format 1.016 is 1.02

环绕模式:HALF_DOWN

 format 1.014 is 1.01
 format 1.015 is 1.01
 format 1.016 is 1.02

环绕模式:HALF_EVEN

 format 1.014 is 1.01
 format 1.015 is 1.01
 format 1.016 is 1.02

以退出代码0结束的过程

那么,有没有一种简单的方法可以将1.015格式化为1.02?(JDK 12,JDK 8)

2 个答案:

答案 0 :(得分:4)

那是因为1.015实际上是 1.0149999999999999023003738329862244427204132080078125

使用BigDecimal的解决方案适用于字符串

BigDecimal db = new BigDecimal("1.015");
db = db.setScale(2, BigDecimal.ROUND_HALF_UP);`

答案 1 :(得分:-1)

使用舍入模式:CEILING(向上舍入)

exec()

示例:public static Double roundUp(double n, int decimalPlace) { BigDecimal instance = new BigDecimal(Double.toString(n)); return instance.setScale(decimalPlace, RoundingMode.CEILING).doubleValue(); } -> roundUp(1.014, 2)

相关问题