2011-06-24 32 views
92

W Javie chcę przekonwertować podwójne do liczby całkowitej, wiem, że jeśli to zrobić:podwójna konwersja do liczby całkowitej w java

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

masz y = 1. Jeśli zrobisz to:

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

Będziesz prawdopodobnie dostać 2. Jednakże zastanawiam się: od podwójne reprezentacje liczb czasami wyglądać 1.9999999998 czy coś, czy istnieje możliwość, że rzucając dwukrotnie utworzony poprzez Math.round() nadal będzie skutkować obciętą liczbą w dół, a nie zaokrągloną liczbą, której szukamy (tj .: 1 zamiast 2 w przedstawionym kodzie)?

(i tak, mam na myśli to, jak takie: Czy jest dowolny wartość dla x, gdzie y pokazać wynik, który jest ścięty, a nie zaokrąglone reprezentacja X?)

Jeśli tak, to: Czy istnieje lepszy sposób na wykonanie podwójnego w zaokrąglone int bez ryzyka obcinania?


Wyobraźmy sobie coś: Math.round (x) zwraca długi, a nie podwójny. Dlatego: Math.round() nie może zwrócić liczby wyglądającej jak 3.9999998. Dlatego int (Math.round()) nigdy nie będzie musiał niczego ciąć i zawsze będzie działał.

+4

Math.round (double) zwraca wartość długą, a nie podwójną. – qbert220

Odpowiedz

79

czy istnieje prawdopodobieństwo, że rzucając podwójne stworzony przez Math.round() będzie nadal prowadzić ściętego w dół liczby

Nie round() zawsze okrągły Twój dwukrotnie do prawidłowej wartości, a następnie, że będzie przesyłaj do long, który obetnie miejsca dziesiętne. Ale po zaokrągleniu nie pozostaną żadne ułamkowe części.

Oto docs z Math.round(double):

Zwraca najbliższy długi do argumentu. Wynik jest zaokrąglany do liczby całkowitej przez dodanie 1/2, pobranie wyniku i rzutowanie wyniku na typ długi. Innymi słowy, wynik jest równa wartości wyrażenia:

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

Ważne jest to, że zaokrąglanie odbywa się w ramach metody rundy. Zwracana jest długa wartość, którą można bezpiecznie odrzucić do int (przy założeniu, że zwrócona wartość zawsze znajdzie się w zakresie int). – qbert220

+0

Tak. Nie potrafię sobie wyobrazić, że/long/int daje problemy. Oczywiście! Powinieneś to sobie wyobrazić :( – vdMandele

+1

Chociaż prawdą jest, że obcięcie nie nastąpi z powodu zaokrąglenia, nadal możesz nie uzyskać oczekiwanych rezultatów po prostu z powodu rzucania z podwójnej liczby, która jest bardzo dużą liczbą '[maks. Podwójna: 1,7976931348623157E308 ] 'do int, który jest znacznie mniejszy' [max int: 2147483647] '. Po prostu coś, o czym należy pamiętać. –

-7
double a = 1.450; 

String sa = String.valueOf(a); 
int lengthUntilPoint = sa.indexOf(".")+1; 
int power = sa.length() - lengthUntilPoint; 
int ia = (int) (a* Math.pow(10, power)); 
+3

Chociaż ten kod może być interesujący, aby nauczyć się podstaw manipulowania strunami, w rzeczywistości nie nadaje się tutaj. Nie tylko ze względu na wykorzystanie czasu i pamięci, ale jest niepoprawny. http://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#toString-double- Jeśli spojrzysz, zobaczysz, że dla niektórych liczb "." charecter nie rozdziela jednostek i dziesiątych, ale jest najbardziej znaczącą i drugą najbardziej znaczącą cyfrą. – v010dya

12

Dla typów danych Double do int, można użyć następujących:

Double double = 5.00; 

int integer = double.intValue(); 
+0

Szuka zaokrąglonej wartości. – EJP

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

Rozwiązałem mój cel.

Powiązane problemy