Meine alte Antwort habe ich mal gelöscht, da ich auf dieses Problem etwas ausführlicher Antworten möchte.
"Floats" wie wir sie nennen, sind nur ein sehr abstraktes Konstrukt, welche diese Werte so präzise wie nur irgendwie möglich nachahmen möchten.
Das mag sich für dich vermutlich sehr merkwürdig anhören, aber so ist es tatsächlich. Dein Computer kann mit dem Begriff "Float" wenig anfangen - er arbeitet eben mit Nullen und Einsen.
Über die letzten Jahrzehnte gab es viele Versuche diese Operationen so präzise wie möglich zu machen, weshalb man den "IEEE"-Standard entworfen hat.
Hier kommen aber auch die Probleme: Wir versuchen eine Fließkommazahl mit ganzen Zahlen zu definieren, welche der Computer kennt.
Daraus folgt jedoch, dass eben diese Zahlen auch irgendwo enden müssen, falls diese unendlich lang sind. Aus diesem Grund muss irgendwo gerundet werden oder eben ein Teil weggelassen werden - das führt zum ersten Faktor, der dein Ergebnis verfälscht.
Nicht nur aus diesen Rundungsprozessen entstehen Abweichungen, sondern auch aus dem IEEE-Format (das zu erklären würde jetzt den Rahmen doch etwas sprengen).
Aus diesen Gründen benutzen Banken auch keine Fließkommazahlen und ich lehne mich mal ganz weit aus dem Fenster: Mit großer Sicherheit auch keine Kassen o.ä.
Daher kann ich dir empfehlen deine Beträge mit einer Konstanten zu multiplizieren und damit in Integer umzuwandeln (und so auch zu speichern), anschließend das Gesamtergebnis dann durch diese zu teilen um eine präzisere Float zu erhalten (oder du lässt es gleich so und formatierst es als String, was deutlich schöner wäre tho - ist aber deine Entscheidung).
Ich hoffe, dass die Antwort ein wenig helfen konnte.
Wichige Quellen:
- https://floating-point-gui.de/ (zeigt das Problem)
- https://de.wikipedia.org/wiki/IEEE_754