Как округлить число до двух знаков после запятой
Короткий ответ
Если нужно только вывести число, отформатируйте его — %.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.34HALF_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.