Как округлить 0.5 в меньшую сторону, а 0.5000001 - в большую

Рейтинг: 5Ответов: 3Опубликовано: 01.04.2023

Я знаю про Math.round(n), но мне нужно чтобы 0.5 округляло в 0 (1.5 -> 1, 2.5 -> 2), а например 0.50000001 уже округляло в 1 (1.50001 -> 2, 2.5001 -> 3). Язык Kotlin или Java

Ответы

▲ 5Принят

Для вашей задачи можно воспользоваться классом java.math.BigDecimal, который используется для более сложных ситуаций с округлением (вроде вашей).

Для решения вашей задачи:

  1. Создадим объект класса BigDecimal:
BigDecimal number = new BigDecimal("0.5");
  1. Задаём правило для округления. В примере 0 - количество цифр после запятой, ROUND_HALF_DOWN - то, округление которое вы и желали получить: если оба соседних числа равноудалены (то есть дробная часть 5 десятых), то округление произойдёт в сторону 0, если же числа не равноудалены, то округление произойдёт по принципу "где ближе".
number = number.setScale(0, ROUND_HALF_DOWN);

И так, что вышло в итоге:

BigDecimal number1 = new BigDecimal("0.5");
BigDecimal number2 = new BigDecimal("0.50000001");

number1 = number1.setScale(0, ROUND_HALF_DOWN); //0
number2 = number2.setScale(0, ROUND_HALF_DOWN); //1
▲ 9

А как насчёт простого:

-Math.round(-n);
▲ -1

Еще как вариант, можно от числа перед округлением отнимать малое значение, которое заведомо меньше точности. Что-то типа:

println(Math.round(1.5 - 0.000000001))        // 1
println(Math.round(1.50000001 - 0.000000001)) // 2

Disclaimer
Этот метод работает на числах с заранее известной точностью и не является универсальным для всех математических операций.

println(Math.round(1.5000000001 - 0.0000000001)) // 2
println(Math.round(100000000.5 - 0.01))          // 100000000