Pourquoi la construction Bigdecimal (double d) est-elle toujours là?
-
20-08-2019 - |
Question
J'ai remarqué une douleur considérable sur ce constructeur (même ici, dans Stack Overflow). Les gens l'utilisent même si la documentation indique clairement:
Les résultats de ce constructeur peuvent être quelque peu imprévisibles http: //java.sun. com / javase / 6 / docs / api / java / math / BigDecimal.html # BigDecimal (double)
J'ai même vu un JSR-13 être APPROUVÉ avec une recommandation indiquant:
Spécifications existantes obsolètes: nous proposons de déconseiller le constructeur BigDecimal (double), qui donne actuellement des résultats différents de la méthode Double.toString ().
Malgré tout, le constructeur n'a pas encore été déconseillé.
Je serais ravi d'entendre vos points de vue.
La solution
La désapprobation est obsolète. Certaines parties des API ne sont considérées comme obsolètes que dans des cas exceptionnels.
Exécutez donc FindBugs dans le cadre de votre processus de construction. FindBugs a une API de détecteur PlugIn et est également open source (LGPL, IIRC).
Autres conseils
Compte tenu du comportement de < => est correct, à mon avis, je ne suis pas sûr que ce soit vraiment un problème.
Je ne suis pas tout à fait d'accord avec le libellé de la documentation dans le BigDecimal(double)
constructeur:
Les résultats de ce constructeur peuvent être un peu imprévisible . On pourrait supposons que l'écriture
new BigDecimal(0.1)
en Java crée unBigDecimal
qui est exactement égal à0.1
(une valeur non échelonnée de1
, avec une échelle de0.1000000000000000055511151231257827021181583404541015625
), mais elle est en réalité égale àBigDecimal(0.1)
.
(non souligné dans l'original)
Plutôt que de dire imprévisible , je pense que le libellé devrait être inattendu , et même ainsi, ce serait un comportement inattendu pour ceux qui ne sont pas conscients des limites de la représentation des nombres décimaux avec les valeurs à virgule flottante .
Tant que vous gardez à l'esprit que les valeurs à virgule flottante ne peuvent pas représenter toutes les valeurs décimales avec précision, la valeur renvoyée par <=> l'être <=> est réellement utile.
Si l'objet <=> instancié par le constructeur <=> est cohérent, je dirais que le résultat est prévisible.
Je suppose que la raison pour laquelle le constructeur <=> n'est pas obsolète est que le comportement peut être considéré comme correct et que, tant que l'on sait comment fonctionnent les représentations à virgule flottante, le comportement du constructeur n'est pas trop surprenant.
Ce constructeur, comme toutes les opérations en virgule flottante, est une approximation. Ce n'est pas vraiment cassé, il a juste des lacunes.
Faites simplement vos recherches, approchez-vous-en avec précaution et vous n'aurez aucune surprise. Vous rencontrez exactement la même chose lorsque vous affectez des littéraux décimaux à des doubles / floats.