Вывод числа с точностью до заданного количества цифр после запятой

Иногда требуется вывести определенное количество цифр после запятой, даже если цифры — концевые нули.

Данную задачу решает класс 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.