1015 Stimmen

dezimal vs. doppelt! - Welchen Wert sollte ich wann verwenden?

Ich sehe immer wieder Leute, die Doubles in C# verwenden. Ich weiß, dass ich irgendwo gelesen habe, dass Doubles manchmal an Präzision verlieren. Meine Frage ist, wann sollte ich einen Double-Typ und wann einen Dezimaltyp verwenden? Welcher Typ ist für Geldberechnungen geeignet? (z. B. größer als 100 Millionen Dollar)

8 Stimmen

Möchten Sie Bruchteile von Cents? (wie an Tankstellen)

0 Stimmen

4 Stimmen

Es gibt eigentlich eine faire Antwort: decimal funktioniert wie long und int (es ist ein ganzzahliger Typ!), aber es hat irgendwo in seiner Syntax und seinem Ausgabeformat einen Punkt (siehe de.wikipedia.org/wiki/Ganzzahl_(Computer_wissenschaft) ). Double und Float arbeiten mit einer Mantisse und einem Exponenten (siehe de.wikipedia.org/wiki/Schwebender_Punkt ). Das war's.

1230voto

David Punkte 23860

Für Geld, toujours dezimal. Deshalb wurde sie geschaffen.

Wenn sich die Zahlen richtig addieren oder ausgleichen müssen, verwenden Sie Dezimalzahlen. Dies gilt auch für die Aufbewahrung von Finanzdaten oder Berechnungen, Spielstände oder andere Zahlen, die von Hand eingegeben werden können.

Wenn der genaue Wert der Zahlen nicht wichtig ist, verwenden Sie double, um die Geschwindigkeit zu erhöhen. Dazu gehören Grafiken, Physik oder andere physikalische Berechnungen, bei denen es bereits eine "Anzahl signifikanter Stellen" gibt.

53 Stimmen

Es ist nicht so, dass das Doppelte ungenau wäre - es hat relativ Genauigkeit und kann sehr große oder kleine Größenordnungen darstellen, mit denen Dezimalzahlen überhaupt nicht umgehen können.

100 Stimmen

Hier erfahren Sie, warum Sie Decimal für Geld verwenden: Die Genauigkeit von Double beträgt nur 16 Dezimalstellen, und schon nach wenigen Rechenoperationen häufen sich Fehler an, die groß genug sind, um sich in die 15, 14, 13 usw. Stellen einzuschleichen. Das Runden auf "Cent" erfordert mindestens eine Stelle voller Genauigkeit nach der Cent-Stelle, aber eigentlich sollten Sie 4 oder 5 reservieren, um sich vor kumulativen Rechenfehlern zu schützen, die die Hundertstel-Spalte, die Sie zum Runden der Cent-Stellen verwenden, NICHT beschädigen dürfen. Damit bleiben Ihnen 16 (insgesamt) - 2 (Cent) - (4 oder 5 Fehlerpuffer) = oh $hit nur 7 (oder weniger) zuverlässige ganze Ziffern für Ihr Geld!

27 Stimmen

Infolgedessen würde ich Geldwerte von mehr als 9,99 $ (1 ganze Zahl) nicht manipulieren, weil ich statt 4 oder 5 Ziffern der Fehlerakkumulationsauffüllung eher 10 oder 11 haben möchte. Da es sich bei Decimal um eine 128-Bit-Zahl handelt, ist diese Art von Isolierung auch bei Zahlen im Bereich von Hunderten von Billionen von Dollar möglich, da die Genauigkeit bei 28-29 Stellen liegt. Allerdings kann man nicht viel höher gehen als das. 999.999.999.999.999.99R (999 Billionen) würde 18 Stellen Genauigkeit erfordern, um richtig zu runden, und da Dezimal 28-29 Stellen bietet, sind das nur 10 Stellen kumulativer arithmetischer Fehlerisolierung.

207voto

Michael Borgwardt Punkte 334642

Meine Frage ist, wann sollte man eine Double und wann sollte ich eine Dezimalzahl verwenden Typ verwenden?

decimal wenn Sie mit Werten im Bereich von 10^(+/-28) arbeiten und wenn Sie Erwartungen an das Verhalten auf der Grundlage von Darstellungen zur Basis 10 haben - im Wesentlichen Geld.

double für den Fall, dass Sie relativ Genauigkeit (d. h. der Verlust von Präzision in den Nachkommastellen bei großen Werten ist kein Problem) bei sehr unterschiedlichen Größenordnungen - double deckt mehr als 10^(+/-300) ab. Wissenschaftliche Berechnungen sind hier das beste Beispiel.

welcher Typ für Geld geeignet ist rechnungen?

dezimal, dezimal , dezimal

Akzeptieren Sie keine Ersatzstoffe.

Der wichtigste Faktor ist, dass double als binärer Bruch implementiert ist, kann nicht genau viele decimal Bruchteile (wie 0,1) überhaupt und die Gesamtzahl der Ziffern ist geringer, da sie 64 Bit breit ist im Vergleich zu 128 Bit bei decimal . Und schließlich müssen Finanzanwendungen oft bestimmten Anforderungen genügen. Rundungsmodi (manchmal gesetzlich vorgeschrieben). decimal unterstützt diese ; double nicht.

2 Stimmen

Es besteht kein Zweifel, dass double nicht für die Darstellung von Finanzwerten verwendet werden soll, aber was meinten Sie genau, als Sie schrieben, dass double unterstützt keine spezifischen Rundungsmodi, im Gegensatz zu einer decimal ? AFAIK, Math.Round hat Überladungen, die die MidpointRounding Parameter für beide double y decimal ?

2 Stimmen

@Groo: Ich glaube, ich muss mir die .Net 1.1 API angesehen haben, die Methode wurde in 2.0 hinzugefügt - aber es ist immer noch ziemlich sinnlos wegen der Probleme mit binären Brüchen. In der aktuellen API-Dokumentation gibt es ein Beispiel, das dieses Problem verdeutlicht.

0 Stimmen

Ich habe diese Zeile in vielen Vergleichen gesehen, konnte aber die Bedeutung nicht verstehen. Können Sie das bitte näher erläutern? "Double kann viele Dezimalbrüche (wie 0,1) überhaupt nicht genau darstellen"

47voto

Chris S Punkte 63542

System.Single / Schwimmer - 7 Ziffern
System.Double / doppelt - 15-16 Ziffern
System.Dezimal / dezimal - 28-29 signifikante Ziffern

Die Art und Weise, wie ich durch die Verwendung des falschen Typs gestochen wurde (vor einigen Jahren), ist bei großen Mengen:

  • £520,532.52 - 8 Ziffern
  • 1.323.523,12 £ - 9 Ziffern

Bei 1 Million ist Schluss für einen Float.

Ein 15-stelliger Geldwert:

  • £1,234,567,890,123.45

9 Billionen mit einem Double. Aber mit Divisionen und Vergleichen ist es komplizierter (ich bin definitiv kein Experte für Fließkommazahlen und irrationale Zahlen - siehe Marcs Punkt ). Die Vermischung von Dezimalzahlen und Doppelzahlen verursacht Probleme:

Eine mathematische oder vergleichende Operation die eine Gleitkommazahl verwendet führt möglicherweise nicht zum gleichen Ergebnis, wenn eine Dezimalzahl verwendet wird, weil die Fließkommazahl möglicherweise nicht nicht genau an die Dezimalzahl Zahl entspricht.

Wann sollte ich Double anstelle von Decimal verwenden? hat einige ähnliche und ausführlichere Antworten.

Verwendung von double anstelle von decimal für monetäre Anwendungen ist eine Mikro-Optimierung - das ist die einfachste Art, wie ich es sehe.

1 Stimmen

520,532.52 hat 8 signifikante Zahlen und 1,323,523.12 hat 9 mathsfirst.massey.ac.nz/Algebra/Decimals/SigFig.htm

1 Stimmen

En float , double y decimal Die Links in Ihrem Beitrag sind defekt. Hier ist ein Link zur neuesten MSDN-Dokumentation zu allen drei numerischen Aliasen: learn.microsoft.com/de-us/dotnet/csharp/language-reference/

43voto

Ian Boyd Punkte 232380

Dezimal ist für exakte Werte. Double ist für ungefähre Werte.

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)

16 Stimmen

Dezimal ist nicht für exakte Werte geeignet. Nach der Dokumentation bietet Decimal eine Genauigkeit von 28-29 Dezimalstellen. Decimal führt keine analytische Arithmetik durch und ist daher nicht "exakt". Dezimal eignet sich hervorragend für Geldbeträge, da selbst bei Werten in Billionenhöhe immer noch 10 Stellen zur Isolierung von kumulativen arithmetischen Fehlern verbleiben, während gleichzeitig eine genaue Rundung auf Cents möglich ist.

7 Stimmen

Warum ist der Wechselkurs doppelt und nicht dezimal? Ist das nicht auch einfach der Preis von 1 USD in CAD?

4 Stimmen

@gerrit Ein Wechselkurs ist nicht das "Preis" von 1 USD in CAD. Es ist der Verhältnis des Wertes der beiden. Wie viele Dezimalstellen Sie erhalten, hängt von Ihrer Quelle ab. Zum Beispiel ist 1 USD 1,0016 CAD wert. 1 britisches Pfund ist 1,5909 CAD wert. 1 vietnamesischer Dong ist 0,000048 CAD wert. Es ist ein Verhältnis kann realistischerweise nirgends abgeschnitten werden, ohne dass die Präzision verloren geht.

28voto

Clement Herreman Punkte 9956

Für Geld: decimal . Es kostet ein wenig mehr Speicherplatz, hat aber keine Rundungsprobleme wie double manchmal hat.

15 Stimmen

Es hat alle Probleme mit dem Runden: versuchen Sie 1m/3m + 1m/3m == 2m/3m . Der Hauptunterschied besteht darin, dass mehr Bits für den Signifikanten zur Verfügung stehen und, was am wichtigsten ist, kein Präzisionsverlust auftritt, wenn Zahlen mit 5 in der Primfaktorzerlegung des Divisors bearbeitet werden. Beispiel. 1m/5m + 1m/5m wird genau gleich sein wie 2m/5m .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X