Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Kann PHP nicht rechnen

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
Ice Man
PostRank 9
PostRank 9
Beiträge: 2477
Registriert: 04.06.2003, 19:16

Beitrag von Ice Man » 17.03.2011, 12:21

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*

Anzeige von ABAKUS

von Anzeige von ABAKUS »

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

Jetzt anfragen: 0511 / 300325-0.


seoprofi3000
PostRank 4
PostRank 4
Beiträge: 135
Registriert: 15.09.2009, 12:53

Beitrag von seoprofi3000 » 17.03.2011, 12:43

Idee:

begrenze mal dein $erg auf 2 nachkommastellen.

seoprofi.

Ice Man
PostRank 9
PostRank 9
Beiträge: 2477
Registriert: 04.06.2003, 19:16

Beitrag von Ice Man » 17.03.2011, 12:46

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.

Hasenhuf
PostRank 9
PostRank 9
Beiträge: 2840
Registriert: 26.12.2005, 22:22

Beitrag von Hasenhuf » 17.03.2011, 12:51

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?

Ice Man
PostRank 9
PostRank 9
Beiträge: 2477
Registriert: 04.06.2003, 19:16

Beitrag von Ice Man » 17.03.2011, 12:52

Bitte was ?
Verstehe gerade nicht was du meinst :)

Melegrian
PostRank 10
PostRank 10
Beiträge: 3170
Registriert: 30.01.2005, 12:36

Beitrag von Melegrian » 17.03.2011, 12:52

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;

Ice Man
PostRank 9
PostRank 9
Beiträge: 2477
Registriert: 04.06.2003, 19:16

Beitrag von Ice Man » 17.03.2011, 12:56

@ Melegrian

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

Melegrian
PostRank 10
PostRank 10
Beiträge: 3170
Registriert: 30.01.2005, 12:36

Beitrag von Melegrian » 17.03.2011, 13:26

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;

Hasenhuf
PostRank 9
PostRank 9
Beiträge: 2840
Registriert: 26.12.2005, 22:22

Beitrag von Hasenhuf » 17.03.2011, 13:35

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.

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 17.03.2011, 14:18

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.

Ice Man
PostRank 9
PostRank 9
Beiträge: 2477
Registriert: 04.06.2003, 19:16

Beitrag von Ice Man » 17.03.2011, 15:09

die spalte war als decimal eingestellt.

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

xlb
PostRank 5
PostRank 5
Beiträge: 282
Registriert: 13.08.2009, 21:11

Beitrag von xlb » 18.03.2011, 02:00

die spalte war als decimal eingestellt.
Alternativ könnte man simple Berechnungen dieser Art innerhalb des Querys direkt von MySQL erledigen lassen.

SloMo
PostRank 10
PostRank 10
Beiträge: 4880
Registriert: 04.01.2005, 18:26

Beitrag von SloMo » 18.03.2011, 03:52

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. :)

Antworten