[Java] Tipps und Fehlerprobleme beim Konvertieren von Double zu Big Decimal

Fazit zuerst

--Wenn Sie von der doppelten in die BigDecimal-Klasse konvertieren möchten (müssen), verwenden Sie die Methode valueOf.

Voraussetzung Umgebung

jdk 1.8.0_102 macOS Sierra 10.12.4

Unterschiede in den Ergebnissen aufgrund der Implementierung

Java



double d = 0.1;

//Code(1)
BigDecimal bd1 = new BigDecimal(d);
System.out.println(bd1.toPlainString());
// 0.1000000000000000055511151231257827021181583404541015625

//Code(2)
BigDecimal bd2 = new BigDecimal(Double.toString(d));
System.out.println(bd2.toPlainString());
// 0.1

//Code(3)
BigDecimal bd3 = BigDecimal.valueOf(d);
System.out.println(bd3.toPlainString());
// 0.1

//Code(4)
BigDecimal bd4 = new BigDecimal("1.0000000000000003");
System.out.println(bd4.toPlainString());
// 1.0000000000000003

//Code(5)
double d2 = 1.0000000000000003;
BigDecimal bd5 = BigDecimal.valueOf(d2);
System.out.println(bd5.toPlainString());
// 1.0000000000000002

Die valueOf-Methode ist daher der beste Weg, um von einer Double- in eine BigDecimal-Klasse zu konvertieren. Einschließlich der Number Wrapper-Klasse sollten Sie sich an "valueOf beim Konvertieren von Number-Objekten" erinnern.

Übrigens können Fehler, die durch die Verwendung von "BigDecimal (double)" verursacht wurden, vom statischen Code-Analyse-Tool FindBugs erkannt werden.

Unvermeidliches Problem

Nicht alle Dezimalzahlen (reelle Zahlen) können als Java-Doppel-ähnliche [Gleitkommazahleneigenschaft] dargestellt werden (http://dangerous-animal141.hatenablog.com/entry/2014/05/10/000000). Aus diesem Grund kann es wie in Code (5) unvermeidlich sein, dass ein Fehler auftritt, wenn er vor der Konvertierung in BigDecimal doppelt gespeichert wird.

Deshalb,

Sie müssen also vorsichtig sein.

Referenz

https://docs.oracle.com/javase/jp/6/api/java/math/BigDecimal.html#BigDecimal(double)

https://docs.oracle.com/javase/jp/6/api/java/math/BigDecimal.html#valueOf(double)

http://dangerous-animal141.hatenablog.com/entry/2014/05/10/000000

http://kyon-mm.hatenablog.com/entry/20101116/1289885313

Recommended Posts

[Java] Tipps und Fehlerprobleme beim Konvertieren von Double zu Big Decimal
Vorsichtsmaßnahmen beim Konvertieren von Dezimal in Binär
Schreiben und Notizen bei der Migration von VB zu JAVA
ClassCastException tritt bei der Migration von Java7 auf Java8 auf. ~ Generics and overload ~
[Java] Flache Kopie und tiefe Kopie beim Konvertieren eines Arrays in eine Liste
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
Aktualisieren Sie JAVA auf die neueste Version auf 1.8.0_144 (beim Herunterladen aus dem Internet und Aktualisieren)
Verhindern Sie, dass die Exponenten-Notation (E) angezeigt wird, wenn toString von Javas Big Decimal ausgeführt wird
Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin
Java Big Decimal
Zusammenfassung beim Versuch, Solr in Java zu verwenden und eine Fehlermeldung zu erhalten (Solr 6.x)
Konvertieren Sie Java Enum Enumeration und JSON von und nach Jackson
[Java] Sortiertipps beim Mischen von Zeichenfolgen und Zahlen
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Von Java zu Ruby !!
Für Sie, die von unerwarteten Dezimalstellen in Java betroffen sind
Neue Funktionen von Java7 bis Java8
Wie man Big Decimal benutzt
Stellen Sie eine Verbindung von Java zu PostgreSQL her
[Java] Big Decimal richtig verwenden ~ 2018 ~
Fehler beim Spielen mit Java
Von ineffektivem Java zu effektivem Java
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Hinweise zum Erstellen der Kotlin-Entwicklungsumgebung und zur Migration von Java nach Kotlin
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
[Achtung !!] Vorsichtsmaßnahmen beim Konvertieren von Rails-Geräten und Anzeigen von Dateien in haml
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
[Java] So konvertieren Sie vom Typ String in den Pfadtyp und erhalten den Pfad
Einführung in Scala aus Java-Perspektive (grundlegend)
Woran ich dachte, als ich anfing, von Java nach Kotlin zu migrieren
Es wurde ein Fehler behoben, der beim Versuch auftrat, Spark in einer Umgebung zu verwenden, in der Java 8 und Java 11 gleichzeitig vorhanden sind