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
--Comme dans code (1), la création d'une instance avec le constructeur BigDecimal (double)
** provoque souvent des erreurs et ne produit pas les résultats attendus. ** **
BigDecimal (String)
, comme dans code (4).BigDecimal (Double.toString (double))
dans code (2) et la méthode BigDecimal.valueOf (double)
dans code (3) vous donneront des résultats "presque" attendus. (Voir ci-dessous)BigDecimal.valueOf (double)
peut être plus efficace ** que le code (2) BigDecimal (Double.toString (double))
.La méthode valueOf est donc le meilleur moyen de convertir une classe double en une classe BigDecimal. En incluant la classe wrapper number, vous devez vous rappeler que "la conversion d'un objet numérique est valueOf".
Par ailleurs, les bogues causés par l'utilisation de BigDecimal (double)
peuvent être détectés par l'outil d'analyse de code statique FindBugs.
Tous les nombres décimaux (nombres réels) ne peuvent pas être représentés sous la forme d'une propriété de nombre à virgule flottante de type double Java (http://dangerous-animal141.hatenablog.com/entry/2014/05/10/000000). Pour cette raison, comme dans le code (5), il peut être inévitable qu'une erreur se produise lorsqu'elle est stockée en double avant la conversion en BigDecimal.
Donc,
Donc, vous devez être prudent.
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