comment java.les mathématiques.RoundingMode travail?
J'ai de la difficulté avec l'arrondissement. Plus précisément, après la lecture de tous les javadoc, j'attendais le code suivant:
int n = (integer between 0 and 9, included)
new BigDecimal(n + 0.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
de retour n + 0.56
. Au lieu de cela, ce sont les valeurs de retour pour n
de 0
à 4
:
new BigDecimal(0.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
0.56
new BigDecimal(1.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
1.55
new BigDecimal(2.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
2.56
new BigDecimal(3.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
3.56
new BigDecimal(4.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
4.55
J'ai aussi essayé de changer le mode d'arrondi:
int n = (integer between 0 and 9, included)
new BigDecimal(n + 0.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
attend n + 0.55
comme un résultat pour chaque et chaque n
. Au lieu de cela, les valeurs de retour sont exactement les mêmes que dans l'exemple précédent:
new BigDecimal(0.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
0.56
new BigDecimal(1.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
1.55
new BigDecimal(2.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
2.56
new BigDecimal(3.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
3.56
new BigDecimal(4.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
4.55
Suis-je raté quelque chose?
OriginalL'auteur ilCatania | 2011-08-19
Vous devez vous connecter pour publier un commentaire.
Le problème que vous avez est que le double n'est pas une représentation précise et vous êtes en ce imprécis nombre.
imprime
cependant
imprime
Cela fonctionne parce que BigDecimal.valueOf n'supplémentaire arrondissement basé sur la façon dont le double apparaît si vous avez imprimé.
Cependant je ne voudrais pas utiliser BigDecimal, à moins que la performance/la simplicité n'est pas un problème.
imprime
Pour plus de détails Le Double de votre argent compare les performances des différentes façons de l'arrondissement.
Je courais mes tests unitaires et ce n'était pas de faire du sens, les valeurs retournées avec le double arrondi au demi. Mais avec BigDecimal tout début de travail.
OriginalL'auteur Peter Lawrey
0.555d
est undouble
valeur. Il peut être légèrement plus grand que 0.555 ou légèrement plus petit.OriginalL'auteur Hot Licks
Mode d'arrondi à utiliser pour la Ronde de la Valeur Décimale.
Vous pouvez utiliser avec.
=>
Mode d'arrondi à tour vers l'infini positif. Pour
les valeurs positives de ce mode d'arrondi se comporte comme, pour
les valeurs négatives comme vers le BAS.
Règle:
x.round() >= x
Mode d'arrondi où les valeurs sont arrondies vers
zéro.
Règle:
x.round().abs() <= x.abs()
Mode d'arrondi à tour vers l'infini négatif. Pour
les valeurs positives de ce mode d'arrondi se comporte comme vers le BAS, pour
les valeurs négatives.
Règle:
x.round() <= x
Mode d'arrondi où les valeurs sont arrondies vers le
voisin le plus proche. Les liens sont brisés par arrondi vers le bas.
Mode d'arrondi où les valeurs sont arrondies vers le
voisin le plus proche. Les liens sont brisés par l'arrondissement à la même
voisin.
Mode d'arrondi où les valeurs sont arrondies vers le
voisin le plus proche. Les liens sont brisés par arrondissement.
Mode d'arrondi où l'arrondi des opérations déclenche une
ArithmeticException
pour le cas où arrondissement estnécessaire, c'est à dire pour le cas où la valeur ne peut pas être
représenté exactement.
Mode d'arrondi où les valeurs positives sont arrondis
vers l'infini positif et négatif vers des valeurs
l'infini négatif.
Règle:
x.round().abs() >= x.abs()
OriginalL'auteur Mansukh Ahir