2012-06-17 13 views
24

Powiel możliwe:
How to round a number to n decimal places in Javamuszę zaokrąglić pływaka do dwóch miejsc po przecinku w Javie

Mam trudności zaokrąglania pływaka do dwóch miejsc po przecinku. Próbowałem kilka metod widziałem tutaj, w tym po prostu za pomocą Math.round(), ale bez względu na to, co robię, otrzymuję niezwykłe numery.

Mam listę obiektów pływających, które przetwarzam, pierwsza z nich jest wyświetlana jako 1.2975118E7. Co to jest E7?

Kiedy używam Math.round(f) (f jest float), otrzymuję dokładnie taki sam numer.

Wiem, że robię coś złego, po prostu nie jestem pewien co.

Po prostu chcę numery są w formacie x.xx. Pierwsza liczba powinna wynosić 1.30, itp.

+2

Chcesz zaokrąglić ciąg wyświetlania * liczby zmiennoprzecinkowej. Prawdopodobnie nie chcesz zaokrąglić samej liczby.Unikaj zmiennoprzecinkowych, a zamiast tego użyj podwójnego zamiast dla większej precyzji, a następnie spójrz na jedną z wielu dostępnych metod, aby uzyskać przyzwoity wynik String podwójnej liczby, w tym String.format (...), NumberFormat lub DecimalFormat. –

Odpowiedz

-3

Spróbuj spojrzeć na klasę BigDecimal. Jest to klasa dla waluty i obsługuje dokładne zaokrąglenia.

+1

Nie rozumiem, czy możesz podać więcej wyjaśnień? – nsfyn55

71

1.2975118E7 to scientific notation.

1.2975118E7 = 1.2975118 * 10^7 = 12975118 

Również zwraca liczbę całkowitą. Nie można go użyć, aby uzyskać żądany format x.xx. Można użyć String.format.

String s = String.format("%.2f", 1.2975118); 
// 1.30 
+1

'String.format' może generować problemy, ponieważ utworzy liczby zmiennoprzecinkowe z kropkami lub przecinkami zgodnie z ustawieniami narodowymi. –

+0

@ YoannHercouet, nie możesz bawić się puszczaniem bez myślenia o locie. To nie powinno stanowić problemu. ;-) – Alexander

+4

użyj tego: String.format (Locale.US, "% .2f", 1.2975118) co jest bezpieczniejsze .. przynajmniej znasz format zawsze ... –

36

Jeśli szukasz formatowania waluty (która nie została określona, ​​ale wydaje się, że jest to, czego szukasz) spróbować klasę NumberFormat. To bardzo proste:

double d = 2.3d; 
NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
String output = formatter.format(d); 

Które wyjście (w zależności od kraju):

$2.30

Ponadto, jeśli waluta nie jest wymagane (tylko dokładnie dwa miejsca po przecinku) można użyć zamiast tego :

NumberFormat formatter = NumberFormat.getNumberInstance(); 
formatter.setMinimumFractionDigits(2); 
formatter.setMaximumFractionDigits(2); 
String output = formatter.format(d); 

który będzie wyjście 2.30

+0

Czy ktoś chciałby wyjaśnić spadki do mojej odpowiedzi i Makoto's? – kcoppock

+0

Nie jestem pewien. Wcześniej głosowałem na ciebie i na @Makato, ponieważ to oni jako pierwsi rozwiązali prawdziwy problem: sformatowaną reprezentację String liczby zmiennoprzecinkowej. –

+1

@Hovercraft Full Of Eels: Thanks; Ja także głosowałem na Makato. Mogę się tylko domyślać, że ktoś jest wkurzony, ponieważ zostało to oznaczone jako duplikat? Nie powoduje, że odpowiedzi są nieważne. Sidenote, możesz mieć najlepszą nazwę użytkownika, jaką kiedykolwiek widziałem. – kcoppock

6

Możesz użyć opcji DecimalFormat, aby nadać stylu, który chcesz.

DecimalFormat df = new DecimalFormat("0.00E0"); 
double number = 1.2975118E7; 
System.out.println(df.format(number)); // prints 1.30E7 

Ponieważ jest to w notacji naukowej, nie będzie w stanie uzyskać dowolny numer mniejszy niż 10 bez utraty że wiele rzędów wielkości dokładności.

+0

Dziękuję wszystkim za pomoc. Naukowa notacja była tym, co dostałem, myślałem, że to nie działa, ponieważ liczby były takie same, ale mój numer był błędny! – lonewookie

+0

Czy mogę zwrócić wartość zmiennoprzecinkową: float roundofDecimal (float dd) { \t DecimalFormat df = new DecimalFormat(); \t df.setMaximumFractionDigits (2); \t System.out.println (df.format (dd)); \t \t return df.format (dd); } – CoronaPintu

+1

@PintuCorna: Nie - nie wygląda na to, że można odzyskać float z 'DecimalFormat'. Szczerze mówiąc, tracisz precyzję, jeśli przechodzisz od double do float; również formatowanie liczby jest formalnością dla osoby czytającej dane - jeśli chcesz uzyskać nieprzetworzoną liczbę zmiennoprzecinkową, po prostu zwróć * to *! – Makoto

Powiązane problemy