Vergleich von int und float mit == gibt false
X-Ray
- php
Hallo!
Nun habe ich ein weiteres Problem:
In meinem Script vergleiche ich einen Float-Wert mit einem Integer-Wert. Beide Werte sind in einem Array abgelegt. Beide Werte sind eine glatte Zahl. Dennoch gibt == immer false zurück.
Was ich versucht habe:
if ($int[0] == $float[0]) {
// Code hier wird nie ausgefuehrt
}
if ((float) $int[0] == (float) $float[0]) {
// Code hier wird nie ausgefuehrt
}
echo is_int($int[0])."|".is_float($float[0]);
// Gibt "1|1" aus
echo $int[0]."|".$float[0];
// Gibt "118|118" aus
Wo kann hier das Problem liegen?
Schönen Gruß
Stefan
Lieber X,
was passiert bei
if ($int[0] / $float[0] == 1) {
// ?
}
oder bei
if ($int[0] - $float[0] == 0) {
// ?
}
Liebe Grüße,
Felix Riesterer.
Hallo Felix,
beide Ausdrücke haben den Wert false.
Interessant ist was bei den jeweiligen Rechnungen herauskommt:
echo $int[0]."|".$float[0];
// 118|118
$ergebnis = $float[0] - $int[0];
echo $ergebnis;
// 1.42108547152E-14
$ergebnis = $float[0] / $int[0];
echo $ergebnis;
// 1
$ergebnis = $int[0] - $float[0];
echo $ergebnis;
// -1.42108547152E-14
$ergebnis = $int[0] / $float[0];
echo $ergebnis;
// 1
Verstehen tue ich es noch immer nicht. Aber vielleicht kann das ja jemand deuten.
Gruß Stefan
echo $begrüßung;
Verstehen tue ich es noch immer nicht. Aber vielleicht kann das ja jemand deuten.
Das übliche Problem mit den Fließkommazahlen und dem Binärsystem: Sie sind häufig nicht exakt darstellbar. Ein ähnliches Problem gibt es beispielsweise bei 1/3 im Dezimalsystem: 0.333333usw.
Vielleicht kannst du (unter Einbuße von Performance) BC Math oder GMP verwenden, wenn du präzise Rechnungen brauchst.
echo "$verabschiedung $name";
Hello,
In meinem Script vergleiche ich einen Float-Wert mit einem Integer-Wert. Beide Werte sind in einem Array abgelegt. Beide Werte sind eine glatte Zahl. Dennoch gibt == immer false zurück.
Was ich versucht habe:
if ((float) $int[0] == (float) $float[0]) {
// Code hier wird nie ausgefuehrt
}
Die Idee mit dem Casten ist im Prinzip schon ganz gut, nur hast Du in die falsche Richtung casted.
if ((int) $int[0] == (int) $float[0])
{
// Code sollte jetzt bei Bedarf aus ausgefuehrt werden.
}
So würden die eventuell vorhandenen Nachkommastellen in der x-ten Stelle abgeschnitten werden beim Float-Wert. Der Int hat ja sowieso keine.
Anders herum würde der Int vermutlich sowieso automatisch durch integrale Promotion in den Float überführt werden, zumindest wenn es sich um eine in C/C++, Pascal oder ähnlichen Hochsprachen geschriebene Applikation handelt. Ich denke, PHP macht das auch so.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
(Hallo|Hi(ho)|Nabend) X-Ray,
In meinem Script vergleiche ich einen Float-Wert mit einem Integer-Wert. Beide Werte sind in einem Array abgelegt. Beide Werte sind eine glatte Zahl. Dennoch gibt == immer false zurück.
if ($int[0] == $float[0]) {
// Code hier wird nie ausgefuehrt
}
if ((float) $int[0] == (float) $float[0]) {
// Code hier wird nie ausgefuehrt
echo $int[0]."|".$float[0];
// Gibt "118|118" aus
>
> Wo kann hier das Problem liegen?
Du vergleichst [Äpfel](http://de.wikipedia.org/wiki/Integer_%28Datentyp%29) mit [Bir](http://de.wikipedia.org/wiki/Gleitkommazahlen)[nen](http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE_754-Standards). Beide fallen zwar unter [Obst](http://de.wikipedia.org/wiki/Zahl#Weitere_Zahlenmengen), haben aber unterschiedliche Eigenschaften.
Echo rundet bei der Ausgabe einer Gleitkommazahl, stellt also nicht den wirklich gespeicherten Wert dar. Das hilft dir nicht weiter.
Du hast genau zwei Möglichkeiten:
1\. Du [rundest die Gleitkommazahl auf einen ganzen Wert](http://www.php.net/manual/en/function.round.php) und vergleichst dann praktisch zwei Ganzzahlen.
2\. Du wandelst die Integer-Zahl in eine Gleitkommazahl um und vergleichst dann zwei Float-Werte.
Hierbei hilft allerdings der Operator "==" nicht mehr.
Das macht dir das PHP-Handbuch auch mit dem [Kommentar "Never never never compare floats for equality!"](http://www.php.net/manual/en/language.types.float.php#30198) mehr als deutlich.
[Zwei Gleitkommazahlen gelten als "gleich", wenn ihre Differenz einen festgelegten Wert nicht überschreitet](http://www.php.net/manual/en/language.types.float.php#35591).
Diese Differenz nennt man [Fehlerschranke](http://de.wikipedia.org/wiki/Fehlerschranke#Softwareentwicklung_.28Numerik.29), kennzeichnet sie mit dem griechischen Buchstaben Epsilon,
und du darfst sie selbst festlegen -- [das solltest du aber mit Bedacht tun](http://www.php.net/manual/en/language.types.float.php#71167).
MffG
EisFuX
--
[Nichts ist dem Zuwachs an Wissen förderlicher, als nach einer Antwort korrigiert zu werden.](http://community.de.selfhtml.org/zitatesammlung/zitat119)
Mist, jetzt hab ich vergessen, noch die zwei Links einzubauen, die sich mit dem
Thema binäre (Gleitkomma-)Zahlendarstellung ausführlicher beschäftigen[1] ...
http://blog.gungfu.de/archives/2005/12/18/genaue-gleitkommazahlen-teil-2/
https://ssl.secure-hosts.de/www.fun-soft.de/showtopic.php?threadid=19838&time=
[1] ... und die mir beim Googeln als erste ins Auge gefallen sind. ;-)
MffG
EisFuX
Tach,
Diese Differenz nennt man Fehlerschranke, kennzeichnet sie mit dem griechischen Buchstaben Epsilon,
und du darfst sie selbst festlegen
sei ε so klein, dass ε/2 schon negativ ist ;-D
SCNR
Woodfighter