2014-12-11 11 views
5

Chcę obliczyć objętość kuli za pomocą programu Java. Tak więc użyłemjava 2 różne problemy z formułą

double result = 4/3*Math.PI*Math.pow(r,3); 

Ta formuła daje błędne odpowiedzi.

program jak Java zdecydować 4/3, ale gdybym go zmienić na

double result= Math.PI*Math.pow(r,3)*4/3; 

daje mi poprawną odpowiedź. Czy ktoś wie, co się dzieje?

+0

1. formatowanie, 2.dzielenie całkowite (4/3) i 3. kolejność działania w języku Java. Upewnij się, że te 3 rzeczy są sprawdzone. –

+2

Właśnie poprawiłem twój format i większość frazowania. Następnym razem poświęć trochę czasu, aby Twoje pytanie było prezentowalne i czytelne. Używaj interpunkcji, wielkich liter tam, gdzie jest to konieczne i używaj znaczników kodu, aby odpowiednio podświetlić. – brimborium

Odpowiedz

3

Różnica w wyniku wynika z pierwszeństwa operatora. W języku Java mnożenie i dzielenie mają równy priorytet, dlatego są oceniane od lewej do prawej.

Więc, pierwszym przykładem jest równoważna

double result = (4/3)*Math.PI*Math.pow(r,3); 

Tutaj, 4/3 jest oddziałem dwóch liczb całkowitych, w Javie, w takich przypadkach podział całkowitą odbywa się z wynikami 1. Aby rozwiązać ten problem , trzeba wyraźnie upewnić się, że jeden lub oba operandy jest podwójne:

double result = (4.0/3.0)*Math.PI*Math.pow(r,3); 

Twój Drugim przykładem jest jednak równoznaczne z

double result = (Math.PI*Math.pow(r,3)*4)/3; 

Tutaj część Math.PI*Math.pow(r,3)*4 jest oceniana na podwójną, a więc nie mamy już podziału na liczby całkowite i otrzymujesz poprawny wynik.

+0

To jest najbardziej wyszukana odpowiedź. -> +1 – brimborium

5

Ma to związek z kolejnością odlewania w Javie (lub C).

Aby uzyskać szczegółowe informacje na temat pierwszeństwa operatora, zobacz http://introcs.cs.princeton.edu/java/11precedence/.

W pierwszym przypadku, ponieważ operatory mnożenia i dzielenia są obliczane od lewej do prawej, pierwsza operacja interpretowana przez java to 4/3. Ponieważ oba operandy są liczbami całkowitymi, java oblicza podział całkowity, którego wynikiem jest 1.

W drugim przypadku pierwszą operacją jest podwójne pomnożenie: (Math.PI Math.pow (r, 3)) . Druga operacja zwielokrotnia podwójne (Math.PI Math.pow (r, 3)) przez liczbę całkowitą (4). Odbywa się to przez rzucanie 4 do podwójnego i wykonywanie podwójnego mnożenia. Last, java musi podzielić double (Math.PI * Math.pow (r, 3) * 4) na liczbę całkowitą (3), którą java wykonuje jako podwójny podział po rzuceniu 3 do podwójnego. Daje to oczekiwany rezultat.

Jeśli chcesz poprawić swoją pierwszą odpowiedź, oddanych 3 podwoić pierwsze:

4/ (double)3 

a dostaniesz wynik można oczekiwać.

+1

Czy istnieje korzyść dla '(double) 3' zamiast' 3.0'? – brimborium

+1

Brak tego, co znam z programowego punktu widzenia. Ale używam wyraźnej (podwójnej) notacji odlewniczej, ponieważ więcej niż jeden raz zostałem spalony przez zapomnienie o "." przy zmianie wartości stałej później. Na przykład. Początkowo mam fragment kodu z czymś podobnym do double x = 3.14/2; i później muszę zmienić moją formułę na, powiedzmy, podwójne x = 3.0/2; ale mogę niechcący napisać podwójne x = 3/2; szczególnie z długą formułą. Jeśli jest tam (podwójne), pozostaje tam, aby wymusić rzucanie, bez względu na wartość. To zabezpieczenie, które lubię mieć. – Lolo

+0

Zwykle zawsze używam '.', więc najpierw zrobiłbym' x = 3.14/2.0'. I myślę, że jest bardziej czytelny niż rzucanie go zdecydowanie. – brimborium

2

4/3 podział na dwa int tak Java zakłada, że ​​wynik jest również int (w tym przypadku powoduje to wartości 1). Zmień go na 4.0/3.0, a wszystko będzie w porządku, ponieważ 4.0 i 3.0 są interpretowane przez Javę jako double.

double result = 4.0/3.0 * Math.PI * Math.pow(r,3);