Как округлить 0.5 в меньшую сторону, а 0.5000001 - в большую
Я знаю про Math.round(n), но мне нужно чтобы 0.5 округляло в 0 (1.5 -> 1, 2.5 -> 2), а например 0.50000001 уже округляло в 1 (1.50001 -> 2, 2.5001 -> 3).
Язык Kotlin или Java
Ответы (3 шт):
Автор решения: Зонтик
→ Ссылка
Для вашей задачи можно воспользоваться классом java.math.BigDecimal, который используется для более сложных ситуаций с округлением (вроде вашей).
Для решения вашей задачи:
- Создадим объект класса
BigDecimal:
BigDecimal number = new BigDecimal(0.5);
- Задаём правило для округления. В примере
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
Автор решения: Eugene Krivenja
→ Ссылка
Еще как вариант, можно от числа перед округлением отнимать малое значение, которое заведомо меньше точности. Что-то типа:
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