OVH Cloud OVH Cloud

Calcul en type "double"

3 réponses
Avatar
degremond
System.out.println( 1.33 - 1.3 );

m'affiche 0.030000000000000027

Qu'est-ce que c'est que cette erreur ?????
Pourquoi il ne me donne pas 0.03 ?

3 réponses

Avatar
Marc Petit-Huguenin
Emmanuel wrote:
System.out.println( 1.33 - 1.3 );

m'affiche 0.030000000000000027

Qu'est-ce que c'est que cette erreur ?????
Pourquoi il ne me donne pas 0.03 ?


Ca n'est pas une erreur. Il ne faut pas utiliser des nombres flottants pour
ce genre de calcul.

System.out.println(BigDecimal.valueOf(1.33).subtract(BigDecimal.valueOf(1.3)));

Avatar
Bruno Jouhier
"Emmanuel" a écrit dans le message de
news:
System.out.println( 1.33 - 1.3 );

m'affiche 0.030000000000000027

Qu'est-ce que c'est que cette erreur ?????
Pourquoi il ne me donne pas 0.03 ?


Parce que le type double ne représente pas exactement la plupart des nombres
décimaux.
Il représente exactement les nombres de la forme s n*2^m où
s est le signe (+ ou -)
n est un entier entre 0 et 2^53 - 1
m est un entier entre -1023 et +1024

Avec ça, on ne peut pas représenter exactement un nombre décimal aussi
simple que 0.1 car sa représentation en base 2 a un nombre infini de bits!

Pour avoir des résultats exacts sur les décimaux, il faut soit utiliser le
type java.math.BigDecimal (lourd et lent), soit se créer son propre type
décimal (s'inspirer du type decimal de C# pour un bon compromis
range/precision/taille/vitesse).

Bruno.

Avatar
Mehdi KASMI
System.out.println( 1.33d - 1.3d );

"Emmanuel" a écrit dans le message de
news:
System.out.println( 1.33 - 1.3 );

m'affiche 0.030000000000000027

Qu'est-ce que c'est que cette erreur ?????
Pourquoi il ne me donne pas 0.03 ?