--Wenn Sie von der doppelten in die BigDecimal-Klasse konvertieren möchten (müssen), verwenden Sie die Methode valueOf
.
jdk 1.8.0_102 macOS Sierra 10.12.4
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
BigDecimal (String)
wie in Code (4) generieren.BigDecimal.valueOf (double)
effizienter sein ** als der Code (2) BigDecimal (Double.toString (double))
.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.
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.
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