2017-09-25 3 views
2

Je me attendais à ce code:BigDecimal Arrondi mal

double valore = 20.775; 

    BigDecimal c = new BigDecimal(valore); 
    c = c.setScale(2, RoundingMode.HALF_UP); 


    System.out.println(c.doubleValue()); 

pour revenir 20,78, mais il est de retour 20,77 au lieu.

Est-ce une erreur? Ou est-ce que je manque quelque chose?

+0

double possible de [imprédictibilité du constructeur de BigDecimal (double)] (https://stackoverflow.com/questions/12218515/unpredictability-of-the-bigdecimaldouble-constructor) – Goibniu

+0

BigDecimal est arrondi correctement. Vous utilisez doubleValue(), ce qui provoque l'erreur. –

Répondre

5

Tout est correct.
Vous pouvez lire quelques détails de haut niveau dans another answer on SO ou lire plus documentation to BigDecimal

Il est rare d'utiliser BigDecimal constructeur avec double param, car elle représente exactement ce qui est à l'intérieur double. Ainsi, lorsque vous écrivez: new BigDecimal(20.775) vous n'êtes pas nécessairement 20,775 à la suite (plutôt que vous aurez quelque chose comme 20.77499999999999857891452847979962825775146484375)

Pour vous tester:
1) le test de représentation BigDecimal
a) System.out.println(new BigDecimal(20.775)); =>20.77499999999999857891452847979962825775146484375
b) System.out.println(new BigDecimal("20.775")); =>20.775

2) Test d'arrondi avec différents constructeurs: BigDecimal
a) new BigDecimal(20.775) après arrondi à mi-hauteur affichera 20,77.
b) new BigDecimal("20.775") après arrondi la moitié vers le haut montrera 20,78.
c) new BigDecimal(String.valueOf(20.775) après avoir arrondi la moitié vers le haut affichera 20,78. En guise de conclusion: Ne pas utiliser le constructeur BigDecimal avec double param. Utilisez plutôt le constructeur BigDecimal avec String param.

Hope it helps