Seite 1 von 1

Kann PHP nicht rechnen

Verfasst: 17.03.2011, 12:21
von Ice Man
Mir ist gerade was komisches augefallen.

Mein Script sollte paar Sachen nachrechnen.
Dabei ist mir das aufgefallen.

1031.1 - 1030.3 = 0.79999999999995

Hier der PHP Code

$wert1 = 1031.10;
$wert2 = 1030.30;
$erg = $wert1 - $wert2;


echo "".$wert1." - ".$wert2." = ".$erg." ";

Wie kann sowas sein ?
Sowas hatte ich noch nie ?

*grübel*

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


b

Verfasst: 17.03.2011, 12:43
von seoprofi3000
Idee:

begrenze mal dein $erg auf 2 nachkommastellen.

seoprofi.

Verfasst: 17.03.2011, 12:46
von Ice Man
jo, wäre auch ne möglichkeit.

Aber bei anderen zahlen rechnet er richtig, nur bei bestimmten Zahlen kommt sowas komisches raus.

1031.5 - 1030.2 = 1.3 geht
1031.6 - 1030.2 = 1.3999999999999 geht nicht

Da stimmt doch irgenwas nicht.
Also müsste ich erstmal round verwenden.

Re: Kann PHP nicht rechnen

Verfasst: 17.03.2011, 12:51
von Hasenhuf
Ice Man hat geschrieben:1031.1 - 1030.3 = 0.79999999999995

Wie kann sowas sein ?
....

1031.5 - 1030.2 = 1.3 geht
1031.6 - 1030.2 = 1.3999999999999 geht nicht
Wie ist denn die Binärdarstellung der Zahlen?

Verfasst: 17.03.2011, 12:52
von Ice Man
Bitte was ?
Verstehe gerade nicht was du meinst :)

Verfasst: 17.03.2011, 12:52
von Melegrian
Bei Kommazahlen sollte mit bc-Funktionen gerechnet werden, wenn Genauigkeit verlangt wird. Ansonsten reicht auch round aus.

https://php.net/manual/de/function.bcsub.php

Code: Alles auswählen

$wert1 = 1031.10;
$wert2 = 1030.30;
$erg = bcsub($wert1, $wert2, 2);

echo $wert1." - ".$wert2." = ".$erg;

Verfasst: 17.03.2011, 12:56
von Ice Man
@ Melegrian

Mit bcsub geht es.
Das kannte ich noch nicht, bisher hab ich immer normal gerechnet.
Aber das ist mir vorher noch nie aufgefallen.

Verfasst: 17.03.2011, 13:26
von Melegrian
Kannte ich auch noch nicht, weil ja im Normalfall round ausreicht. Hat mich nur gerade interessiert. So geht es halt auch.

Code: Alles auswählen

$wert1 = 1031.10;
$wert2 = 1030.30;
$erg = round($wert1 - $wert2, 2);

echo $wert1." - ".$wert2." = ".$erg;

Verfasst: 17.03.2011, 13:35
von Hasenhuf
Ice Man hat geschrieben:Bitte was ?
Verstehe gerade nicht was du meinst :)
Man kann z.B. *,1 nicht als Binärzahl darstellen, im Zusammenhang mit der begrentzten Genauigkeit treten dann solche Effekte auf.

Verfasst: 17.03.2011, 14:18
von Synonym
Kann es sein, dass die Werte aus der Datenbank kommen? Wenn ja, dann hatte ich da schon ein ähnliches Problem, lag da einfach am falschen Datentyp (FLOAT statt DECIMAL). Gerade float macht oft Probleme und hängt ab vom Betriebssystem, 32 oder 64 Bit, den Einstellungen in PHP und auch der CPU.

Deine Rechnungen funktionieren bei mir aber korrekt.

Verfasst: 17.03.2011, 15:09
von Ice Man
die spalte war als decimal eingestellt.

Aber mit den bcsub geht ja alles bestens.
Man lernt halt nie aus :)

Verfasst: 18.03.2011, 02:00
von xlb
die spalte war als decimal eingestellt.
Alternativ könnte man simple Berechnungen dieser Art innerhalb des Querys direkt von MySQL erledigen lassen.

Verfasst: 18.03.2011, 03:52
von SloMo
Die Wikipedia hat mal wieder eine ganz brauchbare Erklärung für diesen Effekt, den es übrigens in jeder Programmiersprache gibt, die mit Floats hantiert:
https://de.wikipedia.org/wiki/Gleitkomm ... Grundlagen

Um auf den Threadtitel zu antworten: Doch, PHP kann rechnen, allein PHP-Programmierer können nicht immer wirklich programmieren. :)