[Java] Conseils et problèmes d'erreur lors de la conversion du double en grand décimal

Conclusion d'abord

Environnement prérequis

jdk 1.8.0_102 macOS Sierra 10.12.4

Différences de résultats dues à la mise en œuvre

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. ** **

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.

Problème inévitable

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.

référence

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] Conseils et problèmes d'erreur lors de la conversion du double en grand décimal
Précautions lors de la conversion de décimal en binaire
Comment écrire et noter lors de la migration de VB vers JAVA
ClassCastException se produit lors de la migration de Java7 vers Java8 ~ Génériques et surcharge ~
[Java] Copie superficielle et copie complète lors de la conversion d'un tableau en liste
Précautions lors de la migration de VB6.0 vers JAVA
Mettez à jour JAVA vers la dernière version vers 1.8.0_144 (lors du téléchargement à partir du Web et de la mise à jour)
Empêcher la notation d'exposant (E) d'apparaître lorsque toString of Java Big Decimal
Résumé des bons points et des précautions lors de la conversion de l'application Java Android vers Kotlin
Java Big Decimal
Résumé en essayant d'utiliser Solr en Java et en obtenant une erreur (Solr 6.x)
Convertir l'énumération Java et JSON vers et depuis Jackson
[Java] Conseils de tri lorsque les chaînes et les nombres sont mélangés
Changements de Java 8 à Java 11
Somme de Java_1 à 100
De Java à Ruby !!
À vous qui êtes troublé par des points décimaux inattendus en Java
Nouvelles fonctionnalités de Java7 à Java8
Comment utiliser Big Decimal
Connectez-vous de Java à PostgreSQL
[Java] Utilisez correctement Big Decimal ~ 2018 ~
Erreur lors de la lecture avec java
De Java inefficace à Java efficace
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
Remarques sur la création de l'environnement de développement de Kotlin et la migration de Java vers Kotlin
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
[Attention !!] Précautions lors de la conversion de la devise Rails et de l'affichage des fichiers en haml
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
[Java] Comment convertir du type String en type Path et obtenir le chemin
Introduction à Scala du point de vue Java (basique)
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
Résolution d'une erreur survenue lors de la tentative d'utilisation de Spark dans un environnement où Java 8 et Java 11 coexistent