Как я мог всегда округлять вверх double
к int
, и никогда не округлить его вниз. Я знаю о Math.round(double)
, но я хочу, чтобы он всегда округлялся. Так что, если он был 3.2
, он округляется до 4.
Всегда раунд вверх по двойному
Ответ 1
Вы можете использовать Math.ceil()
.
См. Ссылку JavaDoc: https://docs.oracle.com/javase/10/docs/api/java/lang/Math.html#ceil(double).
Из документов:
перекрывать
public static double ceil(double a)
Возвращает наименьшее (ближайшее к отрицательной бесконечности) двойное значение, которое больше или равно аргументу и равно математическому целому числу. Особые случаи:
- Если значение аргумента уже равно математическому целому числу, то результат совпадает с аргументом.
- Если аргумент равен NaN или бесконечности, либо положительному нулю, либо отрицательному нулю, то результат совпадает с аргументом.
- Если значение аргумента меньше нуля, но больше -1.0, то результат будет отрицательным нулем.
Обратите внимание, что значение Math.ceil(x) является в точности значением -Math.floor(-x).
Параметры:
- а - значение.
Возвращает:
Наименьшее (ближайшая к отрицательной бесконечности) значение с плавающей точкой, которое больше или равно аргументу и равно математическому целому числу.
Ответ 2
Простыми словами,
-
Math.ceil
всегда будет округлить UP или, как указано выше, в превышении. -
Math.round
округляется вверх или вниз в зависимости от десятичных знаков.- Если десятичное значение равно или больше 5, то округляется.
- decimal = > 5. (1,5 = 2)
- Если десятичное число меньше 5, то округляется вниз.
- decimal < 5. (1,45 = 1)
- Если десятичное значение равно или больше 5, то округляется.
Примеры Math.ceil
и Math.round
:
Код ниже вернется:
Стоимость без Ceil 2.2 и с Ceil 3 (int), 3.0 (double). Если мы округлим его: 2
int m2 = 2200;
double rate = 1000.0;
int costceil = (int)Math.ceil(m2/rate);
double costdouble = m2/rate;
double costdoubleceil = Math.ceil(m2/rate);
int costrounded = (int)Math.round(m2/rate);
System.out.println("Cost, without Ceil "+costdouble+" and with Ceil "+
costceil+"(int), "+costdoubleceil+"(double). If we round it: "+costrounded);
Если мы изменим значение m2 на пример 2499, результатом будет:
Стоимость без Ceil 2.499 и с Ceil 3 (int), 3.0 (double). Если мы округлим его: 2
Если мы изменим значение m2, например, 2550, результатом будет:
Стоимость без Ceil 2.55 и с Ceil 3 (int), 3.0 (double). Если мы округлим его: 3
Надеюсь, это поможет. (Информация, извлеченная из предыдущих ответов, я просто хотел сделать ее более ясной).
Ответ 3
private int roundUP(double d){
double dAbs = Math.abs(d);
int i = (int) dAbs;
double result = dAbs - (double) i;
if(result==0.0){
return (int) d;
}else{
return (int) d<0 ? -(i+1) : i+1;
}
}
Хорошая работа!;)
Ответ 4
Мой метод относительно прост, надеюсь, что он сработает для вас.
В моем случае у меня есть строка объектов, которые могут содержать только 3 элемента, и я должен отрегулировать количество строк, которые я должен разместить для элементов.
Итак, у меня есть несколько Double NumberOfRows, затем я использую numberOfRows.intValue(), чтобы получить значение int для numberOfRows.
если значение int, которое я получаю, меньше, чем numberOfRows, я добавляю 1 к numberOfRows, чтобы округлить его, иначе значение, которое я получаю от numberOfRows.intValue(), является ответом, который я хочу.
Я написал этот простой цикл для проверки:
for(int numberOfItems = 0; numberOfItems < 16; numberOfItems++) {
Double numberOfRows = numberOfItems / 3.0;
System.out.println("Number of rows are: " + numberOfRows);
System.out.println("Number of items are: " + numberOfItems);
if(numberOfRows.intValue() < numberOfRows) {
System.out.println("int number of rows are: " + (numberOfRows.intValue() + 1));
}
else {
System.out.println("int value of rows are: " + numberOfRows.intValue());
}
System.out.println();
System.out.println();
}
Ответ 5
Короткий пример без использования Math.ceil().
public double roundUp(double d){
return d > (int)d ? (int)d + 1 : d;
}
Exaplanation: Сравните операнд с закругленным операндом с помощью typecast, если аргумент с большим возвратом округлен до + 1 (означает округление вверх) else неизменный операнд.
Пример в псевдокоде
double x = 3.01
int roundDown = (int)x // roundDown = 3
if(x > roundDown) // 3.01 > 3
return roundDown + 1 // return 3.0 + 1.0 = 4.0
else
return x // x equals roundDown
В любом случае вы должны использовать Math.ceil()
. Это всего лишь простой пример того, как вы могли бы сделать это самостоятельно.
Ответ 6
TL;DR
BigDecimal( "3.2" ).setScale( 0 , RoundingMode.CEILING )
4
BigDecimal
Если вы хотите точность, а не производительность, избегайте с плавающей запятой. Это означает, что вы избегаете float
, float
, double
, double
. Для точности используйте BigDecimal
класс.
В a BigDecimal
, установите масштаб, число цифр справа от десятичной точки. Если вы не хотите десятичной дроби, установите масштаб на ноль. И укажите режим округления . Чтобы всегда округлить фракцию вверх, используйте RoundingMode.CEILING
, задокументированный как:
Округление режима округляется до положительной бесконечности. Если результат положительный, он ведет себя как для RoundingMode.UP; если отрицательный, ведет себя как RoundingMode.DOWN. Обратите внимание, что этот режим округления никогда не уменьшает вычисленное значение. Так, например, 1.1 становится 2, а ваш 3.2 становится 4.
BigDecimal bd = new BigDecimal( "3.2" ) ;
BigDecimal bdRounded = bd.setScale( 0 , RoundingMode.CEILING ) ;
String output = bdRounded.toString() ;
System.out.println( "bdRounded.toString(): " + bdRounded ) ; // 4
4
Смотрите этот запуск кода на IdeOne.com.
Ответ 7
Math.ceil()
даст вам самое близкое минимальное значение, если вы хотите округлить его до самых близких значений, которые вы должны использовать Math.floor()
Ответ 8
Math.ceil
public static double ceil (double a)
Возвращает наименьшую (ближайшую к отрицательной бесконечности) двойную величину , которая больше или равна аргументу и равна математическому целому числу. Особые случаи: