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.

Était-ce utile?

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 un   BigDecimal qui est exactement égal à   0.1 (une valeur non échelonnée de 1, avec une échelle de 0.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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top