5 votes

BigDecimal à partir de Double : valeur incorrecte ?

J'essaie de créer un BigDecimal à partir d'une chaîne de caractères. Ne me demandez pas pourquoi, j'en ai juste besoin ! Voici mon code :

Double theDouble = new Double(".3");
System.out.println("The Double: " + theDouble.toString());
BigDecimal theBigDecimal = new BigDecimal(theDouble);
System.out.println("The Big: " + theBigDecimal.toString());

C'est le résultat que j'obtiens ?

The Double: 0.3
The Big: 0.299999999999999988897769753748434595763683319091796875

Des idées ?

12voto

Jim Garrison Points 39523

Lorsque vous créez un double, la valeur 0,3 ne peut pas être représentée exactement. Vous pouvez créer un BigDecimal à partir d'une chaîne de caractères sans le double intermédiaire, comme dans l'exemple suivant

new BigDecimal("0.3")

Un nombre à virgule flottante est représenté par une fraction binaire et un exposant. Par conséquent, certains nombres ne peuvent pas être représentés exactement. Il existe un problème analogue en base 10 avec des nombres tels que 1/3, qui vaut 0,333333333...... Toute représentation décimale de 1/3 est inexacte. Cela se produit pour un ensemble DIFFERENT de fractions en binaire, et 0,3 fait partie de l'ensemble qui est inexact en binaire.

1voto

alfasin Points 19063

Une autre façon est d'utiliser MathContext.DECIMAL32 qui garantit une précision de 7 chiffres (ce qui est suffisant dans notre cas) :

Double theDouble = new Double(".3");
System.out.println("The Double: " + theDouble.toString());
BigDecimal theBigDecimal = new BigDecimal(theDouble, MathContext.DECIMAL32);  // <-- here
System.out.println("The Big: " + theBigDecimal.toString());

SORTIE

The Double: 0.3
The Big: 0.3000000

0voto

Steve B. Points 23227

Vous pouvez donner à une grande décimale une précision spécifiée, par exemple en l'ajoutant à votre exemple :

Double theDouble = new Double(".3");
theBigDecimal = new BigDecimal(theDouble, new MathContext(2));
System.out.println("The Big: " + theBigDecimal.toString());

Ceci imprimera "0.30"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X