Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как округлить число до двух знаков после запятой

Короткий ответ

Если нужно только вывести число, отформатируйте его — %.2f округляет до двух знаков:

void main() {
    double value = 3.14159;
    IO.println(String.format("%.2f", value));
}

Результат:

3.14

%.2f использует язык системы: с русской локалью вы увидите 3,14. Чтобы всегда была точка, передайте Locale.US первым аргументом.

Округлить само значение

Чтобы получить округлённое double для дальнейших вычислений, умножьте на 100, округлите и разделите обратно:

void main() {
    double value = 2.6789;
    double rounded = Math.round(value * 100) / 100.0;
 
    IO.println(rounded);
}

Результат:

2.68

Точно — через BigDecimal

BigDecimal.setScale() округляет без ошибок двоичной арифметики и позволяет выбрать правило округления. HALF_UP — привычное школьное правило:

void main() {
    var price = new BigDecimal("2.345");
 
    IO.println(price.setScale(2, RoundingMode.HALF_UP));
    IO.println(price.setScale(2, RoundingMode.HALF_EVEN));
    IO.println(price.setScale(2, RoundingMode.DOWN));
}

Результат:

2.35
2.34
2.34

HALF_EVEN — «банковское» округление: половину округляет к чётной цифре.

Частая ошибка

Округлять double и ждать точного результата. Число 1.005 хранится в памяти как 1.00499999…, поэтому округляется вниз:

void main() {
    IO.println(Math.round(1.005 * 100) / 100.0);
    IO.println(new BigDecimal("1.005").setScale(2, RoundingMode.HALF_UP));
}

Результат:

1.0
1.01

Для денег и других точных значений используйте BigDecimal, созданный из строки.

Функции из этого ответа

  • Math.round() — Округляет число до ближайшего целого.
  • BigDecimal — Точное десятичное число — для денег и расчётов, где недопустимы ошибки округления double.
  • String.format() — Собирает строку по шаблону с подстановками вроде %s и %d.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.