Chcę wydrukować podwójną wartość w Javie bez postaci wykładniczej.
double dexp = 12345678;
System.out.println("dexp: "+dexp);
To pokazuje ten zapis E: 1.2345678E7
.
Chcę go wydrukować w ten sposób: 12345678
Jaki jest najlepszy sposób, aby temu zapobiec?
dexp: 12345681.000000
która zła wartość. A właściwie po tym chcę wyświetlić ją na mojej stronie internetowej, gdzie jest wyświetlana w ten sposób.1.2345678E7
Czy mimo to mogę ją przechowywać w dowolny12345678
sposób?%.0f
.%.0f
zaokrągla liczbę. Czy istnieje sposób, aby po prostu odrzucić końcowe zera?Java zapobiega notacji E podwójnie:
Pięć różnych sposobów konwersji podwójnej liczby na normalną:
Ten program drukuje:
Które mają tę samą wartość.
Protip: Jeśli jesteś zdezorientowany, dlaczego te losowe cyfry pojawiają się powyżej pewnego progu w podwójnej wartości, ten film wyjaśnia: komputerowy, dlaczego
0.1
+0.2
równa się0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
źródło
W skrócie:
Jeśli chcesz pozbyć się zer i problemów z ustawieniami regionalnymi, powinieneś użyć:
Wyjaśnienie:
Dlaczego inne odpowiedzi mi nie pasują:
Double.toString()
lubSystem.out.println
lubFloatingDecimal.toJavaFormatString
wykorzystuje notacji naukowej, gdy podwójne jest mniejsza niż 10 ^ -3 lub większą niż lub równą 10 ^ 7Przy użyciu
%f
domyślna dokładność dziesiętna wynosi 6, w przeciwnym razie możesz ją zakodować na stałe, ale powoduje to dodanie dodatkowych zer, jeśli masz mniej miejsc po przecinku. Przykład:Używając
setMaximumFractionDigits(0);
lub%.0f
usuwasz dokładność dziesiętną, co jest dobre dla liczb całkowitych / długich, ale nie dla podwójnej:Korzystając z DecimalFormat, jesteś zależny lokalnie. W języku francuskim separatorem dziesiętnym jest przecinek, a nie kropka:
Korzystanie z ustawień regionalnych w języku ANGIELSKIM zapewnia, że otrzymasz punkt separatora dziesiętnego, niezależnie od miejsca działania programu.
Po co więc używać 340
setMaximumFractionDigits
?Dwa powody:
setMaximumFractionDigits
akceptuje liczbę całkowitą, ale jej implementacja ma maksymalną dozwoloną liczbę cyfr, zDecimalFormat.DOUBLE_FRACTION_DIGITS
czego 340Double.MIN_VALUE = 4.9E-324
więc z 340 cyframi na pewno nie zaokrąglisz swojej liczby podwójnej i stracisz precyzję.źródło
new BigDecimal(myvalue).toPlainString()
Z opisu na docs.oracle.com/javase/7/docs/api/java/math/… ), nie jest od razu oczywiste, jak się zachowuje, gdy podaje się różne typy liczb, ale eliminuje notację naukową .new BigDecimal(0.00000021d).toPlainString()
wyjście,0.0000002100000000000000010850153241148685623329583904705941677093505859375
które nie jest tym, czego można oczekiwać ...BigDecimal.valueOf(0.00000021d).toPlainString()
również działa (używa konstruktora ciągów BigDecimal, dlatego)Możesz tego spróbować
DecimalFormat
. Dzięki tej klasie możesz bardzo elastycznie analizować swoje liczby.Możesz dokładnie ustawić wzór, którego chcesz użyć.
W twoim przypadku na przykład:
źródło
Mam inne rozwiązanie z funkcją toPlainString () BigDecimal, ale tym razem za pomocą konstruktora ciągów, który jest zalecany w javadoc:
Wygląda to tak w najkrótszej formie:
W wersjach wcześniejszych niż Java 8 wynikiem tego jest „0.0” dla dowolnych Doubles o zerowej wartości, dlatego należy dodać:
NaN i wartości nieskończone należy dodatkowo sprawdzić.
Ostateczny wynik wszystkich tych rozważań:
Można to również skopiować / wkleić, aby ładnie współpracować z Float.
źródło
d.doubleValue() == 0
zamiastd == 0
?Działa to tak długo, jak długo Twój numer jest liczbą całkowitą:
Jeśli podwójna zmienna ma precyzję po przecinku dziesiętnym, zostanie obcięta.
źródło
Musiałem przekonwertować niektóre wartości podwójne na walutę i stwierdziłem, że większość rozwiązań była OK, ale nie dla mnie.
W
DecimalFormat
końcu był dla mnie sposób, więc oto co zrobiłem:Jak widać, jeśli liczba jest naturalna, otrzymuję - powiedzmy - 20000000 zamiast 2E7 (itd.) - bez kropki dziesiętnej.
A jeśli jest dziesiętny, dostaję tylko dwie cyfry dziesiętne.
źródło
Kompilator Java / Kotlin konwertuje dowolną wartość większą niż 9999999 (większą lub równą 10 milionom) na notację naukową, tj. Notacja Epsilion .
Np .: 12345678 jest konwertowany na 1,2345678E7
Użyj tego kodu, aby uniknąć automatycznej konwersji na notację naukową:
źródło
Poniższy kod wykrywa, czy podany numer jest prezentowany w notacji naukowej. Jeśli tak, jest reprezentowany w normalnej prezentacji z maksymalnie 25 cyframi.
źródło
Myślę, że każdy miał dobry pomysł, ale wszystkie odpowiedzi nie były proste. Widzę, że jest to bardzo przydatny fragment kodu. Oto fragment tego, co zadziała:
".8"
miejscu można ustawić liczbę miejsc po przecinku chcesz pokazać.Używam Eclipse i to nie działało bez problemu.
Mam nadzieję, że to było pomocne. Byłbym wdzięczny za wszelkie opinie!
źródło
Miałem ten sam problem w kodzie produkcyjnym, gdy używałem go jako wejściowego ciągu znaków do funkcji math.Eval (), która pobiera ciąg taki jak „x + 20/50”
Przejrzałem setki artykułów ... W końcu poszedłem z tym ze względu na szybkość. A ponieważ funkcja Eval zamierzała ostatecznie przekonwertować ją z powrotem na własny format liczb, a funkcja mat.Eval () nie obsługiwała końcowego E-07, który zwróciły inne metody, a wszystko powyżej 5 dp było zbyt szczegółowe dla mojej aplikacji .
Jest to teraz używane w kodzie produkcyjnym aplikacji, która ma ponad 1000 użytkowników ...
źródło
Może to być styczna .... ale jeśli musisz wprowadzić wartość liczbową jako liczbę całkowitą (która jest zbyt duża, aby być liczbą całkowitą) w serializatorze (JSON itp.), Prawdopodobnie prawdopodobnie potrzebujesz „BigInterger”
Przykład: wartość jest łańcuchem - 7515904334
Musimy przedstawić go w postaci liczbowej w komunikacie Jsona: {„contact_phone”: „800220-3333”, „servicer_id”: 7515904334, „servicer_name”: „SOME CORPORATION”}
Nie możemy go wydrukować lub otrzymamy: {„contact_phone”: „800220-3333”, „servicer_id”: „7515904334”, „servicer_name”: „SOME CORPORATION”}
Dodanie wartości do takiego węzła daje pożądany wynik: BigInteger.valueOf (Long.parseLong (wartość, 10))
Nie jestem pewien, czy to jest naprawdę na ten temat, ale ponieważ to pytanie było moim największym hitem, kiedy szukałem mojego rozwiązania, pomyślałem, że podzielę się tutaj z korzyścią dla innych, okłamuj mnie, którzy źle wyszukują. :RE
źródło
W przypadku wartości całkowitych reprezentowanych przez a
double
można użyć tego kodu, który jest znacznie szybszy niż inne rozwiązania.źródło
Moje rozwiązanie: String str = String.format ("% .0f", twojaDouble);
źródło