Bei Multiplikation eines doppelten Wertes mit 100.0 kommt es zu Rundungsfehlern?

7

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?

    
Sophtware 08.07.2010, 15:04
quelle

8 Antworten

21

Sie sollten wirklich Dezimal für Geld Berechnungen verwenden.

%Vor%     
Jesper Palm 08.07.2010, 15:06
quelle
8

Sie könnten decimal -Werte für genaue Berechnungen verwenden. Double ist eine Gleitkommazahl, die bei Berechnungen nicht garantiert ist.

    
Andrew Bezzub 08.07.2010 15:06
quelle
4

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.

    
Donald Miner 08.07.2010 15:07
quelle
3

Versuchen Sie

%Vor%     
ULysses 08.07.2010 15:11
quelle
0

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.

    
Justin Ethier 08.07.2010 15:08
quelle
0

nein, Multiplizieren führt nicht zu Rundungsfehlern aber nicht alle Werte können durch Fließkommazahlen dargestellt werden. x.55 ist einer von ihnen)

    
yatagarasu 08.07.2010 15:09
quelle
0

Dezimal hat mehr Präzision als ein Doppel. Geben Sie eine Dezimalzahl ein.

Ссылка

    
jdot 08.07.2010 15:10
quelle
0

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.

    
murgatroid99 08.07.2010 15:07
quelle

Tags und Links