OVH Cloud OVH Cloud

arrondi ....

5 réponses
Avatar
Gaetan Rey
voila, on vient d'avoir un probleme lors de la réalisation du programme
suivant :

public class Application1 {
public Application1() {
Double d = new Double(3.3);
System.out.println("a = valeur du double : "+d.doubleValue());
System.out.println("b = valeur entiere du double en double :
"+(double)d.intValue());
System.out.println("a - b = " + ( d.doubleValue()-
(double)d.intValue() ));
}

static public void main(String[] args) {
new Application1();
}
}

voila le resultat obtenue sous windows XP
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)

>java Application1
a = valeur du double : 3.3
b = valeur entiere du double en double : 3.0
a - b = 0.2999999999999998

est ce que quelqu'un à une solution ? et surtout une explication ?

Gaetan ....

5 réponses

Avatar
Gaetan Rey
enocre le meme probleme :

public class Application1 {

static public void main(String[] args) {
float a = (float)3.3;
float b = (float)3.0;

System.out.println("a = : " + a );
System.out.println("b = : " + b );
System.out.println("a - b = " + (a - b));
System.out.println("a / b = " + (a / b));
}
}

donne comme résultats :

a = : 3.3
b = : 3.0
a - b = 0.29999995
a / b = 1.1


et
public class Application1 {

static public void main(String[] args) {
double a = 3.3;
double b = 3.0;

System.out.println("a = : " + a );
System.out.println("b = : " + b );
System.out.println("a - b = " + (a - b));
System.out.println("a / b = " + (a / b));
}
}

donne comme résultats :
a = : 3.3
b = : 3.0
a - b = 0.2999999999999998
a / b = 1.0999999999999999


est ce que quelqu'un à une solution ? et surtout une explication ?

Gaetan ....


Avatar
Philippe Vandenbulcke
Rien d'anormal; selon les définitions du language java et sa
représentation se nombres,le résultat montré est prévisible et répétable...
Tout vient de la représentation mathématiquement incomplète (arrondis)
des valeurs de type double, par la machine, pour le language java.
L'avantage d celui-ci est que la même erreur se répétera exactement
pareille sur toutes les machines tournant du java (contairement à
d'autres languages, genre C). La norme employée est IEEE 754 en 64 bits.
vdb


voila, on vient d'avoir un probleme lors de la réalisation du programme
suivant :

public class Application1 {
public Application1() {
Double d = new Double(3.3);
System.out.println("a = valeur du double : "+d.doubleValue());
System.out.println("b = valeur entiere du double en double :
"+(double)d.intValue());
System.out.println("a - b = " + ( d.doubleValue()-
(double)d.intValue() ));
}

static public void main(String[] args) {
new Application1();
}
}

voila le resultat obtenue sous windows XP
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)

java Application1
a = valeur du double : 3.3

b = valeur entiere du double en double : 3.0
a - b = 0.2999999999999998

est ce que quelqu'un à une solution ? et surtout une explication ?

Gaetan ....



Avatar
Marc Petit-Huguenin
Gaetan Rey wrote:
voila, on vient d'avoir un probleme lors de la réalisation du programme
suivant :

public class Application1 {
public Application1() {
Double d = new Double(3.3);
System.out.println("a = valeur du double : "+d.doubleValue());
System.out.println("b = valeur entiere du double en double :
"+(double)d.intValue());
System.out.println("a - b = " + ( d.doubleValue()-
(double)d.intValue() ));
}

static public void main(String[] args) {
new Application1();
}
}

voila le resultat obtenue sous windows XP
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)

java Application1
a = valeur du double : 3.3

b = valeur entiere du double en double : 3.0
a - b = 0.2999999999999998

est ce que quelqu'un à une solution ?


java.math.BigDecimal

et surtout une explication ?

Gaetan ....



Avatar
Auge Frederic
Gaetan Rey wrote:

voila le resultat obtenue sous windows XP
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)

java Application1
a = valeur du double : 3.3

b = valeur entiere du double en double : 3.0
a - b = 0.2999999999999998

est ce que quelqu'un à une solution ? et surtout une explication ?

Gaetan ....


bon alors, déjà pour une fois Windows n'y est pour rien ;-)
et java n'est pas le seul langage concerné par ce problème.

Ici tu trouveras toutes les explications
http://www2.hursley.ibm.com/decimal/decifaq.html

et des classes IBM pour faire des calculs précis
http://www2.hursley.ibm.com/decimalj/

Frédéric


Avatar
Xavier Tarrago
Il n'y a pas d'explication, et pas d'erreur (du moins si on raisonne dans le
cadre de ce qui est exprimable par une machine, ce qui est différent de la
rigueur mathématique).

Les réels dans un programme informatique sont codés en puissances de 2.
Comme on utilise un nombre fini de bits (32 pour les float et 64 pour les
doubles), on ne peut en exprimer de façon exacte qu'un nombre fini. Et ce ne
sont pas forcément ceux qui s'écrivent simplement en décimal.

Je pense que le nombre 0.3 n'est pas exprimable sous forme de puissance de 2
et que le nombre expriimable le plus proche est 0.29999999...98. Le résultat
obtenu est le plus précis possible compte tenu de l'architecture de la
machine.

La solution, c'est
1 - d'agir sur la forme et de demander l'affichage avec un format xxx.xx.
2 - ne pas faire de tests d'égalité, a== b, mais (Math.abs(b-a)< epsilon)

Pour info, après test, sur ma machine,
System.err.println("b-a = " + (3.3-3.)); ---> b-a = 0.2999999999999998
et
System.err.println( ((3.3-.3) == .3) ); ---> false



"Marc Petit-Huguenin" a écrit dans le message de
news:eywoc.78651$
Gaetan Rey wrote:
voila, on vient d'avoir un probleme lors de la réalisation du programme
suivant :

public class Application1 {
public Application1() {
Double d = new Double(3.3);
System.out.println("a = valeur du double : "+d.doubleValue());
System.out.println("b = valeur entiere du double en double :
"+(double)d.intValue());
System.out.println("a - b = " + ( d.doubleValue()-
(double)d.intValue() ));
}

static public void main(String[] args) {
new Application1();
}
}

voila le resultat obtenue sous windows XP
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)

java Application1
a = valeur du double : 3.3

b = valeur entiere du double en double : 3.0
a - b = 0.2999999999999998

est ce que quelqu'un à une solution ?


java.math.BigDecimal

et surtout une explication ?

Gaetan ....