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 ?
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 ....
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 ....
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 ?
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 ....
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 ....
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
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 ....
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
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/
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
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 ....
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" <marc@petit-huguenin.org> a écrit dans le message de
news:eywoc.78651$Ik.5791811@attbi_s53...
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
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