2013-10-27 3 views
19

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

Возможно ли это?

+8

'Math.ceil' - если у вас есть такая проблема в будущем, вы можете прочитать сгенерированный JavaDoc соответствующей библиотеки. В этом случае Math –

+0

Даже если вам не нравится RTFM, работает 'Math.round (yourNum + 0.5)'. – nhgrif

+1

@nhgrif Не совсем как '0.0' будет округлено до' 1', это то же самое, что округление и добавление 1. –

ответ

26

Вы можете использовать метод Math.ceil().

См JavaDoc ссылка: https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#ceil-double-

Из документов:

CEIL

public static double ceil(double a) 

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

  • Если значение аргумента уже равно математическому целому числу, тогда результат будет таким же, как и аргумент.
  • Если аргумент NaN или бесконечность или положительный нуль или отрицательный ноль, то результат будет таким же, как и аргумент.
  • Если значение аргумента меньше нуля, но больше -1,0, тогда результат отрицательный.

Обратите внимание, что значение Math.ceil (x) - это точно значение -Math.floor (-x).

Параметры:

  • а - значение.

Возвращает:

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

+0

Если вы можете процитировать по ссылке, это поможет людям найти весь ответ на Stack Overflow. –

+0

@ ZacharyVance done – rpax

+0

_ceil_ возвращает _double_, он попросил _int_ –

-2

Math.ceil() даст вам самое близкое самое низкое значение, если вы хотите быть округлены до ближайших больших значений следует использовать Math.floor()

+1

Это снова к фронту. – EJP

-2

Math.ceil

общественности статической двойной CEIL (двойной а)

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

0
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;   
    } 
} 

Хорошая работа!;)

7

В простых словах

  • Math.ceil будет всегда округлить или, как было сказано выше, в избытка.
  • Math.round будет округлять вверх или вниз в зависимости от десятичных знаков.
    • Если десятичное является равной или выше, чем 5, то это округляется до.
      • десятичное => 5. (1,5 = 2)
    • Если десятичное является менее 5, то это , округленным.
      • десятичные < 5. (1,45 = 1)

Примеры Math.ceil и Math.round:

Код Ниже будет возвращать:
Стоимость без CEIL 2.2 и с Ceil 3 (int), 3,0 (двойной). Если мы вокруг него: 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); 

Если изменить значение м2 до, например , результат был бы: Стоимость без CEIL 2.499 и CEIL 3 (INT), 3,0 (двойной) , Если мы округлим его: 2
Если мы изменим значение m2 на, например, , результатом будет:
Стоимость без Ceil 2.55 и с Ceil 3 (int), 3.0 (double). Если мы округлим его: 3

Надеюсь, это поможет. (Информация, извлеченная из предыдущих ответов, я просто хотел сделать ее более понятной).

0

Мой метод относительно прост, надеюсь, что он сработает для вас.

В моем случае у меня есть ряд объектов, которые могут содержать только 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(); 
    } 
0

Краткий пример без использования Math.ceil().

public double roundUp(double d){ 
    return d > (int)d ? (int)d + 1 : d; 
} 

Exaplanation: Сравнить операнд округляется вниз операнд, используя приведение типа, если больше возврата округляется вниз аргумент + 1 (означает округление вверх) еще без изменений операнда.

Пример в псевдокоде

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(). Это всего лишь простой пример того, как вы могли бы сделать это самостоятельно.

0

Т.Л., д-р

BigDecimal("3.2").setScale(0 , RoundingMode.CEILING) 

BigDecimal

Если вы хотите accuracy rather than performance, избежать floating point технологии. Это означает, что необходимо избегать float, Float, double, Double. Для точности используйте класс BigDecimal.

На BigDecimal, set the scale, количество цифр справа от знака после запятой. Если вы не хотите десятичной дроби, установите масштаб на ноль. И укажите rounding mode. Чтобы всегда округлить фракцию вверх, используйте 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 

Смотрите эту code run live at IdeOne.com.

Смежные вопросы