Das mache ich, was 99,999% der Zeit funktioniert:
%Vor%Der Betragswert ist ein Double. Ich versuche, den Wert in Pennies in eine Textdatei für den Transport zu einem Server für die Verarbeitung zu schreiben. Der Betrag ist nie mehr als 2 Stellen der Genauigkeit.
Wenn Sie 580.55 für den Betrag verwenden, gibt diese Codezeile 58054 als Zeichenfolgenwert zurück.
Dieser Code läuft auf einem Webserver in 64-Bit.
Irgendwelche Ideen?
Sie sollten wirklich Dezimal für Geld Berechnungen verwenden.
%Vor% Sie könnten decimal
-Werte für genaue Berechnungen verwenden. Double ist eine Gleitkommazahl, die bei Berechnungen nicht garantiert ist.
Ich nehme an, dass 580.55 in 58054.9999999999999999999999999999 konvertiert wird ... in diesem Fall wird int auf 58054 abgerundet. Vielleicht möchten Sie Ihre eigene Funktion schreiben, die Ihren Betrag in eine Art Rundung umwandelt Schwelle, damit dies nicht geschieht.
Sie sollten aufgrund von Rundungsfehlern wie diesem keinen doppelten Wert zur Darstellung der Währung verwenden.
Stattdessen sollten Sie die Verwendung von ganzzahligen Werten zur Darstellung von Geldbeträgen in Erwägung ziehen, damit sie genau dargestellt werden. Um Dezimalstellen darzustellen, können Sie einen ähnlichen Trick verwenden, indem Sie 580.55
als Wert 58055
speichern.
nein, Multiplizieren führt nicht zu Rundungsfehlern aber nicht alle Werte können durch Fließkommazahlen dargestellt werden. x.55 ist einer von ihnen)
Mein Vorschlag wäre, den Wert als Ganzzahl von Pennies zu speichern und dollars_part = pennies / 100
und cents_part = pennies % 100
zu übernehmen. Rundungsfehler werden dadurch vollständig vermieden.
Bearbeiten: Als ich diesen Beitrag geschrieben habe, habe ich nicht gesehen, dass du das Zahlenformat nicht ändern kannst. Die beste Antwort ist wahrscheinlich die runde Methode, wie andere vorgeschlagen haben.
BEARBEITEN 2: Wie andere bereits erwähnt haben, wäre es am besten, eine Art dezimale Festkomma-Variable zu verwenden. Das ist besser als meine ursprüngliche Lösung, weil es die Information über die Position des Dezimalpunkts in dem Wert, wo es gehört, statt in dem Code speichert.