# int und double auf gleich prüfen?



## l00P (28. Apr 2006)

hallo!

ich würde gerne einen int (1) mit einem float (1.00) vergleichen. In diesem Falle ist das ja das gleiche aber mit equal geht das nicht.

also :

1 und 1.00 soll true sein
1 und 1.1 soll false sein
1 und 1.001 ist false
1 und 1.0001 ist auch true

hat jemand eine idee wie ich das vergleichen kann??

danke schomal


----------



## mattulla (28. Apr 2006)

hmm spontan wuerde ich sagen, dass du die Differenz zwischen den beiden Werten bildest und schaust ob die einen gewissen Wert ueberschreitet oder nicht


```
if(Math.abs(deinInt - deinDouble) < 0,0001)
```


----------



## l00P (28. Apr 2006)

... hmm da gibts eine java.lang.NumberFormatException
mein int ist 1 und mein float ist 1.00

Also int - float dürfte nicht funktionieren...
kann der das so nicht auflösen??


----------



## mattulla (28. Apr 2006)

hab gerade weder eclipse noch sonst was zur verfuegung kann es also nicht ausprobieren.....wuerds dann aber mal so probieren:


```
if(Math.abs((double)deinInt - deinDouble) < 0,0001)
```


----------



## Guest (28. Apr 2006)

l00P hat gesagt.:
			
		

> hallo!
> 
> ich würde gerne einen int (1) mit einem float (1.00) vergleichen. In diesem Falle ist das ja das gleiche aber mit equal geht das nicht.
> 
> ...



Warum willst du die beiden Werte auch mit equals vergleichen? Versuch doch einfach mal ==.


```
int i = 1;
double d = 1.00;

if (i == d) {
   system.out.println("Werte gleich");
} else {
   system.out.pringln("Werte NICHT gleich");
}
```

Bei dem Code kriege ich "Werte gleich" wenn ich d = 1.01 nehme bekomme ich "Werte NICHT gleich".


----------



## l00P (28. Apr 2006)

ja aber bei 1.0004 z.B. soll auch true rauskommen...

Also im Klartext wenn zahl größer ist als 0.0009 dann fehler!


----------



## Murray (28. Apr 2006)

mattulla hat gesagt.:
			
		

> ```
> if(Math.abs((double)deinInt - deinDouble) < 0,0001)
> ```



So mag der Compiler die Konstante nicht, besser:

```
if(Math.abs((double)deinInt - deinDouble) < 0.0001)
```

Oder - wenn es unbedingt floats statt doubles sein sollen:

```
if(Math.abs((float)deinInt - deinFloat) < 0.0001F)
```


----------



## l00P (28. Apr 2006)

... eigentlich sollte es so funktionieren aber kann mir einer sagen warum da so ein schmarrn rauskommt???

String DurationOfData = "8.0001"
Double roundedDuration = 8.0

Math.abs(Double.parseDouble(durationOfData) - roundedDuration)

Ergebnis ist : 9.999999999976694E-5

Sollte eber doch 0.0001 sein oder???


----------



## Leroy42 (28. Apr 2006)

Schmarrn


----------



## Kawa-Mike (28. Apr 2006)

E-5 steht für 10 hoch minus 5, also 0.00001
9.99999997669 * 0.00001 = 0.000099999.... ,
gerundet 0.0001 ( ich hoffe ich habe mich mit den vielen 0'en nicht vertippt ).

also stimmt das Ergebnis. Intern werden die Zahlen normalisiert dargestellt, also eine - ich glaube bei float 13 stellige - Ziffernfolge gefolgt von einem Exponenten. Wenn du mit float oder double Rechnest, hast du immer gewisse Rundungsfehler.


----------



## mattulla (28. Apr 2006)

Grund fuer diese ungenauen Rechnungen ist im uebrigen das binaersystem mit dem ein PC rechnet die Zahl 0,1 sieht im Binaersystem zB so aus:
0.00011001.....
soweit ich weiss ist sie sogar periodisch....


----------



## l00P (2. Mai 2006)

ja aber wie komme ich jetzt auf mein ergebnis 0,0001? Das ist mir noch völlig unklar! So wie´s auch der taschenrechner ausrechnet....


----------



## byte (2. Mai 2006)

z.b. mit NumberFormat oder DecimalFormat - oder einfach über die Forensuche. :roll:


----------

