Режим округления Java NumberFormat, почему формат половины от 1,015 до 1,01 не до 1,02 - PullRequest
2 голосов
/ 31 октября 2019

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

ОкруглениеРежим: CEILING

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

Режим округления: FLOOR

 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 ]

4 голосов
/ 31 октября 2019

Это потому, что 1.015 на самом деле 1.0149999999999999023003738329862244427204132080078125

Решение, использующее BigDecimal, работает для строки

BigDecimal db = new BigDecimal("1.015");
db = db.setScale(2, BigDecimal.ROUND_HALF_UP);`
0 голосов
/ 31 октября 2019

Использование режима округления: ПОТОЛОК (для округления)

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) -> 1.02

...