Float Werte addieren, komisches verhalten

Hallo zusammen,
mir ist gerade etwas komisches aufgefallen und ich bin mir nicht sicher ob es wichtig ist.

Wenn man eine Float Variable die auf 0.0 steht drei mal um 0.1 erhöht (Script im Anhang), dann ergibt das nicht 0.3 sondern 0,30000000000000004. :confused:

Wenn man das Script nur einmal, zweimal, viermal oder auch fünfmal durchführt passiert das nicht!
Update. Beim achten mal ergibt es 0,7999999999999999.

Aktuell läuft bei mir IP-Symcon 5.4, Windows x64, 30.04.2020, 976df559a312.

Gruß, Raul.

$FloatVar = GetValueFloat(51818);
SetValueFloat(51818,$FloatVar + 0.1);

Ich kann das weder mit der aktuellen 5.3 Stable noch mit der aktuellen 5.4 Beta nachstellen. Jeweils auf einer Ubuntu VM.

Grüße,
Chris

Damit ist doch in jeder Programmiersprache und auf jeder CPU zu rechnen, daß Float eben nicht „exakt“ sind sondern solche Artefakte auf den letzten Nachkommastellen auftreten können. Ich würde das im Profil auf die gewünschte Nachkomma-Darstellung anpassen oder bei Textausgabe mit sprintf.

Siehe auch hier:

https://www.php.net/manual/de/language.types.float.php

Mir ist schon klar das man bei Berechnungen (multiplizieren und dividieren) Probleme beim runden bekommen kann, aber bei simpler Addition!?

Und beim zwölften mal erhält man wie zu erwarten 1.2

Aber wenn ihr sagt das es normal ist, dann gebe ich mich damit auch zufrieden!

Gruß, Raul.

Ja, das kann aufgrund der Kodierung passieren. Wikpedia erklärt das recht technisch: Gleitkommazahl – Wikipedia (insbesondere IEEE754)

paresy

Moin Raul,

nicht nur Berechnungen sondern auch Vergleiche mit Floatwerten sind äußerst kritisch wie du hier PHP kleiner als (hat die Funktion von kleiner/gleich) sehen kannst.

Falls es ein Trost für dich ist, über diese Probleme sind schon ganze Generationen von Programmierern gestolpert :wink: Bei Tests wurden gerne Aufgaben mit Floatwerten verwendet um zu erkennen, ob ein Bewerber wirklich die Programmiersprache beherrscht.

Gruß
Hans