Иногда требуется вывести определенное количество цифр после запятой, даже если цифры - концевые нули.
Данную задачу решает класс
DecimalFormat, которому в конструктор класса необходимо передать шаблон числа.
Рассмотрим несколько вариантов использования:
1) Пример округления до трех знаков
DecimalFormat df = new DecimalFormat("0.000");
System.out.println(df.format(13.6784));//результат 13,678
System.out.println(df.format(13.6785));//результат 13,678
System.out.println(df.format(13.67851));//результат 13,679
System.out.println(df.format(13));//результат 13,000
Разделителем между целой и дробной частью в данном случае выступает запятая, но это зависит от текущей локализации.
Если в качестве разделителя требуется точка, то можем это сделать, указав американскую локализацию.
2) Округление до двух знаков и американская локализация
DecimalFormat df = new DecimalFormat("0.00",DecimalFormatSymbols.getInstance(Locale.US));
System.out.println(df.format(13.6749));//результат 13.67
System.out.println(df.format(13.6750));//результат 13.68
System.out.println(df.format(13.6751));//результат 13.68
System.out.println(df.format(13));//результат 13.00
3) Если вы были внимательны, то могли заменить, что округление работает странным образом.
Например,
System.out.println(df.format(13.6785));//результат 13,678
Хотя ожидаемый ответ: 13,679.
Все дело в том, что по умолчанию используется округление
HALF_EVEN, где округление идет в сторону ближайшего четного. Это так называемое "Округление банкиров", которое используется главным образом в США. Такой способ округления позволяет снизить накопление ошибок при округлении.
Рассмотрим пример: дробные части
.49 и
.51 уравновешивают друг друга, одно число округляется в меньшую, а второй в большую строну. Но как быть с дробной частью
.50, которая, допустим, всегда увеличивается в большую строну. Для этого придумали следующую систему: смотрим соседнее число, если число нечетно, то округляем в большую сторону; если четное, то округляем в меньшую сторону. Или проще говоря, округляем половину до ближайшего четного числа. Рассмотрим два случая:
1) Число 13.6785 после округления будет 13.678,
т.к. цифре 5 предшествует четная цифра 8 (округляем вниз).
2) Число 13.6795 после окгруления будет 13.680.
т.к. цифре 5 предшествует нечетная чифра 9 (округляем вверх).
Пример кода, описывающего эту ситуацию (HALF_EVEN):
DecimalFormat df = new DecimalFormat("0.000");
System.out.println(df.format(13.6785));//результат 13,678
System.out.println(df.format(13.6795));//результат 13,680
Если вас не устраивает такое округление, то можно переключиться на округление, более привычное нам - округление в б
ольшую сторону (HALF_UP):
DecimalFormat df = new DecimalFormat("0.000");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(df.format(13.6785));//результат 13,679
System.out.println(df.format(13.6795));//результат 13,680
Добавить комментарий