2012-01-06 12 views
36

come è possibile arrotondare un numero in virgola mobile al successivo valore intero in Java? Supponiamoarrotondare un numero in virgola mobile al valore intero successivo in java

2,1 -> 3

3.001 -> 4

4.5 -> 5

7.9 -> 8

+3

java.lang.Math.ceil? – Mysticial

+1

Grazie ... è successo anche a me..' (int) Math.ceil (i/j) 'dove' i, j sono int' ... se 'i/j' era' 2.1' mi ha restituito '2' invece di' 3' come previsto da 'Math.ceil'. tuttavia, se ho mantenuto 'j' come un' double', ha funzionato come previsto. – Vikram

+2

Hey Vikram, questo succede perché la divisione tra interi restituisce un intero. È un po 'strano all'inizio è come funziona. Se vuoi i decimali, uno dei lati della divisione deve essere un float o doppio – enTropy

risposta

30

Si dovrebbe guardare a soffitto arrotondando per eccesso nei pacchetti matematici di java: Math.ceil


MODIFICA: aggiunto il javadoc per Math.ceil. Può valere la pena di leggere tutto il metodo in Math.

http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#ceil%28double%29

public static double ceil(double a)

risultato il più piccolo (più vicino a infinito negativo) doppio valore che è maggiore o uguale all'argomento ed è uguale ad un numero intero matematica . Casi speciali:

  • Se il valore dell'argomento è già uguale a un numero intero matematico, il risultato è uguale all'argomento.
  • Se l'argomento è NaN o infinito o zero positivo o zero negativo, il risultato è lo stesso dell'argomento.
  • Se il valore dell'argomento è minore di zero ma maggiore di -1.0, il risultato è zero negativo.

Nota che il valore di Math.ceil(x) è esattamente il valore di -Math.floor(-x).

+0

potresti spiegarlo per favore. –

+4

Math.ceil (2.1) produrrà 3. – Steven

+0

grazie mille –

7

Vedi

float a=10.34f,b=45.678f; 

System.out.println((int)Math.ceil(a)); 
System.out.println((int)Math.ceil(b)); 

uscita

11 
46 
+1

Math.ceil (5/2) è 2.0 dovrebbe essere 3 ?? – GaneshP

+5

@GaneshP: È perché sia ​​'5' che' 2' sono considerati come numeri interi. Quindi, l'intera aritmetica entra in gioco. Immergendoli come hai detto, 'Math.ceil (5/2)' darebbe un risultato intero che è '2' (gli interi non possono contenere una parte frazionaria) con la presente che' 2' viene passato come argomento al 'cell()' il metodo che restituisce '2' - ceiling of' 2' è '2.0' come ovvio. Se invece avessi fatto uno o entrambi "float" o "double", avresti effettivamente visto "3.0" come "Math.ceil (5/2D)", "Math.ceil (5D/2D)" ',' Math.ceil (5/2F) ',' Math.ceil (5F/2F) 'o anche' Math.ceil (5.0/2.0) 'ecc. – Tiny

16

provare questo

float a = 4.5f; 

int d = (int) Math.ceil(a); 

System.out.println(d); 
9

Ho avuto lo stesso problema in cui ero ancora ricevendo il valore int più piccolo. Era la divisione, non il Math.ceil. Devi aggiungere un cast (float) agli interi. Ecco come ho risolto:

int totalNumberOfCachedData = 201; 
int DataCountMax = 200; 

float ceil =(float) totalNumberOfCachedData/(float)DataCountMax; 
int roundInt = (int) Math.ceil(ceil); 

Questo mi darà 2 per il valore di roundInt.

+0

Esattamente quello di cui ho bisogno. –

2

Sto usando questo:

public static int roundDoubleToUpperInt(double d){ 
    return (d%1==0.0f)?(int)d:(int)(d+1); 
} 
0

Se aiuta qualcuno, ecco come ottengo questo lavoro:

int arraySize = 3; 
int pageSize = 10; 
int pagesQty = (int) Math.ceil(arraySize/(float) pageSize); 

System.out.println(pagesQty); 

//Displays 1 

divisore deve essere un galleggiante per poter funzionare correttamente.

Problemi correlati