conversione di double in integer in java


114

In Java, voglio convertire un doppio in un numero intero, so se lo fai:

double x = 1.5;
int y = (int)x;

ottieni y = 1. Se lo fai:

int y = (int)Math.round(x);

Probabilmente otterrai 2. Tuttavia, mi chiedo: poiché le rappresentazioni doppie di interi a volte sembrano 1.9999999998 o qualcosa del genere, esiste la possibilità che il casting di un doppio creato tramite Math.round () risulti comunque in un numero troncato, piuttosto rispetto al numero arrotondato che stiamo cercando (es .: 1 invece di 2 nel codice come rappresentato)?

(e sì, lo intendo come tale: esiste un valore per x, dove y mostrerà un risultato che è una rappresentazione troncata anziché arrotondata di x?)

In tal caso: esiste un modo migliore per trasformare un double in un int arrotondato senza correre il rischio di troncamento?


Ho capito qualcosa: Math.round (x) restituisce un long, non un double. Quindi: è impossibile per Math.round () restituire un numero simile a 3.9999998. Pertanto, int (Math.round ()) non avrà mai bisogno di troncare nulla e funzionerà sempre.


6
Math.round (double) restituisce un long, non un double.
qbert220

Risposte:


95

c'è la possibilità che lanciare un doppio creato tramite Math.round()risulti ancora in un numero troncato

No, round()arrotonderà sempre il tuo doppio al valore corretto, quindi verrà convertito in un longche troncerà eventuali cifre decimali. Ma dopo l'arrotondamento, non rimarranno parti frazionarie.

Ecco i documenti di Math.round(double):

Restituisce il long più vicino all'argomento. Il risultato viene arrotondato a un numero intero aggiungendo 1/2, prendendo il floor del risultato e convertendo il risultato in un tipo long. In altre parole, il risultato è uguale al valore dell'espressione:

(long)Math.floor(a + 0.5d)

3
Il punto importante è che l'arrotondamento viene eseguito all'interno del metodo round. Viene restituito un valore lungo, di cui è possibile eseguire il cast in modo sicuro a un int (supponendo che il valore restituito sia sempre compreso nell'intervallo int).
qbert220

Sì. Non riesco a immaginare un / lungo / per int dare problemi. Ovviamente! Avrei dovuto
capirlo

1
Sebbene sia vero che il troncamento non si verificherà a causa dell'arrotondamento, potresti comunque non ottenere i risultati attesi semplicemente a causa del casting da double che è un numero molto grande [max double: 1.7976931348623157E308]a int che è molto molto più piccolo [max int: 2147483647]. Solo qualcosa da tenere a mente.
Nelda.techspiress

22

Per il tipo Doubledi dati a int, puoi utilizzare quanto segue:

Double double = 5.00;

int integer = double.intValue();

Sta cercando un valore arrotondato.
Marchese di Lorne

1
Non penso che darà quello che ti aspetti per 4.99999999999 (darà 4 non 5)
murkle

10
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Ha risolto il mio scopo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.