Il s'agit d'un probleme que vous connaissez surement deja.
Le programme suivant:
 
package sans_titre1;
 
/**
 * Titre :
 * Description :
 * Copyright :    Copyright (c) 2002
 * Soci�t� :
 * @author
 * @version 1.0
 */
 
public class Sans_titre1
 {
   static public double freq = 191.0;
   static public int i;
 
  public Sans_titre1()
  {
  }
 
   public static void main(String[] args)
   {
     System.out.println("");
     System.out.println("Double Testing");
     for (i=0; i<5; i++)
      {
       Double d = new Double(freq);
       System.out.println("i = "+ i+":  Double = "+d.doubleValue()+"  freq= "+freq);
       freq = freq + 5E-2;
      }
 
     System.out.println("");
     for (double f=192.1;f<=193.2;)
      {
       f+=0.05d;
       Double d=new Double(f);
       System.out.println(d.doubleValue()+"");
      }/*fin du for */
   }/* fin du main*/
 
}
 
donne les resultats suivants:
 
Double Testing
i = 0:  Double = 191.0  freq= 191.0
i = 1:  Double = 191.05  freq= 191.05
i = 2:  Double = 191.10000000000002  freq= 191.10000000000002
i = 3:  Double = 191.15000000000003  freq= 191.15000000000003
i = 4:  Double = 191.20000000000005  freq= 191.20000000000005
 
192.15
192.20000000000002
192.25000000000003
192.30000000000004
192.35000000000005
On voit bien que dans les deux cas,  un supplement infime est ajoute au resultat, ce qui nuit a un test de comparaison sur egalite. De plus, dans le cas ou on soustrairait au lieu d'additionner le resultat serait encore pire. Il y a bien des solutions en mulitpliant par 10 et en divisant par 10 mais je cherche une solution elegante avec un listing comprehensible. L'un de vous aurait-il une idee?
Alain 

Répondre à