Подтвердить что ты не робот

Всегда раунд вверх по двойному

Как я мог всегда округлять вверх double к int, и никогда не округлить его вниз. Я знаю о Math.round(double), но я хочу, чтобы он всегда округлялся. Так что, если он был 3.2, он округляется до 4.

4b9b3361

Ответ 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)

Примеры 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)

Возвращает наименьшую (ближайшую к отрицательной бесконечности) двойную величину , которая больше или равна аргументу и равна математическому целому числу. Особые случаи: