Was ist der Unterschied zwischen decimal
, float
y double
in .NET?
Wann würde jemand so ein Gerät benutzen?
Was ist der Unterschied zwischen decimal
, float
y double
in .NET?
Wann würde jemand so ein Gerät benutzen?
float
y double
sind schwimmend binär Punkttypen . Mit anderen Worten: Sie stellen eine Zahl wie diese dar:
10001.10010110011
Sowohl die Binärzahl als auch die Position des Binärpunkts sind im Wert kodiert.
decimal
es un schwimmend dezimal Punkttyp . Mit anderen Worten: Sie stellen eine Zahl wie diese dar:
12345.65789
Auch hier sind die Anzahl und der Standort der dezimal Punkt sind beide in dem Wert kodiert - das macht den decimal
immer noch ein Gleitkommatyp anstelle eines Festkommatyps.
Wichtig ist, dass Menschen daran gewöhnt sind, nicht ganzzahlige Werte in dezimaler Form darzustellen, und dass sie bei dezimalen Darstellungen exakte Ergebnisse erwarten. Nicht alle Dezimalzahlen lassen sich in binären Fließkommazahlen exakt darstellen - 0,1 zum Beispiel -, so dass Sie bei Verwendung einer binären Fließkommazahl eine Annäherung an 0,1 erhalten. Auch bei der Verwendung von Fließkommazahlen erhält man Näherungswerte - das Ergebnis der Division von 1 durch 3 kann beispielsweise nicht exakt dargestellt werden.
Was ist wann zu verwenden?
Für Werte, die "natürlich exakte Dezimalzahlen" sind, ist es gut, die decimal
. Dies eignet sich in der Regel für alle von Menschen erfundenen Konzepte: finanzielle Werte sind das offensichtlichste Beispiel, aber es gibt auch andere. Denken Sie zum Beispiel an die Bewertung von Tauchern oder Eiskunstläufern.
Für Werte, die eher Artefakte der Natur sind und nicht wirklich gemessen werden können genau sowieso, float
/ double
sind besser geeignet. So werden beispielsweise wissenschaftliche Daten normalerweise in dieser Form dargestellt. Hier sind die Originalwerte nicht von vornherein "dezimal genau", so dass es für die erwarteten Ergebnisse nicht wichtig ist, die "Dezimalgenauigkeit" beizubehalten. Binäre Fließkommatypen sind viel schneller zu verarbeiten als Dezimalzahlen.
float
/ double
stellen Zahlen normalerweise nicht als 101.101110
Normalerweise wird es als etwas wie folgt dargestellt 1101010 * 2^(01010010)
- ein Exponent
@Hazzard: Das ist es, was der Teil "und die Lage des Binärpunkts" in der Antwort bedeutet.
Ich bin überrascht, dass das noch nicht gesagt wurde, float
ist ein C#-Alias-Schlüsselwort und kein .Net-Typ. es ist System.Single
.. single
y double
sind binäre Gleitkommatypen.
Der wichtigste Unterschied ist die Präzision.
Schwimmer - 7 Ziffern (32 Bit)
Doppelter -15-16 Stellen (64 Bit)
Dezimal -28-29 signifikante Stellen (128 Bit)
Dezimalzahlen haben eine viel höhere Genauigkeit und werden normalerweise in Finanzanwendungen verwendet, die ein hohes Maß an Genauigkeit erfordern. Dezimalzahlen sind viel langsamer (in einigen Tests bis zum 20-fachen) als Double/Float.
Dezimalzahlen und Gleitkommazahlen/Doppelzahlen können nicht ohne einen Cast verglichen werden, während Gleitkommazahlen und Doppelzahlen dies können. Dezimalzahlen erlauben auch die Kodierung von Nullen am Ende.
float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);
Ergebnis :
float: 0.3333333
double: 0.333333333333333
decimal: 0.3333333333333333333333333333
Diese Antwort muss korrigiert werden. Die Genauigkeit für Decimal ist nicht 128 Bit, sondern unendlich, da sich das Format wesentlich von Float unterscheidet. Die Antwort von @Skeet ist die beste. Example: 0.1 = 0.099999.... in float but in decimal it is 0.l, that is infinite precision. If you were to use 128 bits precision like in floats, you would get 0.999999....(upto 29 digits) but that is still not precise as decimal 0.1
@Thecrocodilehunter: Tut mir leid, aber nein. Dezimal kann alle Zahlen darstellen, die in Dezimalschreibweise dargestellt werden können, aber zum Beispiel nicht 1/3. 1.0m / 3.0m ergibt 0.33333333... mit einer großen aber endlichen Anzahl von 3en am Ende. Die Multiplikation mit 3 ergibt nicht genau 1,0.
Dies ist ein Fehler in der Zahl selbst (in diesem Fall 0,3333...), nicht in ihrer dezimalen Darstellung, wo sie zu 100 % getreu erzeugt wird. Wenn Sie einen Fehler in die Zahl eingeführt haben, kann ihn niemand mehr beseitigen (nicht einmal Dezimalzahlen). Die einzige Möglichkeit, den Fehler aus dieser Zahl zu entfernen, besteht darin, 1/3 und nicht 0,333 zu verwenden. Manche Taschenrechner nehmen 1/3 als Mittelwert, aber die meisten tun das nicht. Try this: represent 0.3333 in floating point, you will end up with 0.3332999998..., this is not 0.3333 (you see the error). Now represent this in decimal it is 0.3333 (exactly as it is, no error - 100% accurate).
+---------+----------------+---------+----------+---------------------------------------------------------+
| C# | .Net Framework | Signed? | Bytes | Possible Values |
| Type | (System) type | | Occupied | |
+---------+----------------+---------+----------+---------------------------------------------------------+
| sbyte | System.Sbyte | Yes | 1 | -128 to 127 |
| short | System.Int16 | Yes | 2 | -32,768 to 32,767 |
| int | System.Int32 | Yes | 4 | -2,147,483,648 to 2,147,483,647 |
| long | System.Int64 | Yes | 8 | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
| byte | System.Byte | No | 1 | 0 to 255 |
| ushort | System.Uint16 | No | 2 | 0 to 65,535 |
| uint | System.UInt32 | No | 4 | 0 to 4,294,967,295 |
| ulong | System.Uint64 | No | 8 | 0 to 18,446,744,073,709,551,615 |
| float | System.Single | Yes | 4 | Approximately ±1.5e-45 to ±3.4e38 |
| | | | | with ~6-9 significant figures |
| double | System.Double | Yes | 8 | Approximately ±5.0e-324 to ±1.7e308 |
| | | | | with ~15-17 significant figures |
| decimal | System.Decimal | Yes | 16 | Approximately ±1.0e-28 to ±7.9e28 |
| | | | | with 28-29 significant figures |
| char | System.Char | N/A | 2 | Any Unicode character (16 bit) |
| bool | System.Boolean | N/A | 1 / 2 | true or false |
+---------+----------------+---------+----------+---------------------------------------------------------+
Sie haben den größten Unterschied ausgelassen, nämlich die Basis, die für den Dezimaltyp verwendet wird (Dezimal wird zur Basis 10 gespeichert, alle anderen aufgeführten numerischen Typen sind zur Basis 2).
Die Wertebereiche für Single und Double sind in der obigen Abbildung oder im Quell-Forenbeitrag nicht korrekt dargestellt. Da wir den Text hier nicht einfach hochstellen können, verwenden wir das Caret-Zeichen: Single sollte 10^-45 und 10^38 sein, und Double sollte 10^-324 und 10^308 sein. Außerdem hat MSDN den Float mit einem Bereich von -3,4x10^38 bis +3,4x10^38. Suchen Sie bei MSDN nach System.Single und System.Double, falls sich der Link ändert. Single: msdn.microsoft.com/de-us/library/b1e65aza.aspx Doppelt: msdn.microsoft.com/de-us/library/678hzkk9.aspx
Die Dezimalstruktur ist strikt auf Finanzberechnungen ausgerichtet, die eine hohe Genauigkeit erfordern und relativ unempfindlich gegenüber Rundungen sind. Für wissenschaftliche Anwendungen sind Dezimalzahlen jedoch aus mehreren Gründen nicht geeignet:
Wenn Sie Finanzberechnungen durchführen, müssen Sie unbedingt Ihre eigenen Datentypen entwickeln oder eine gute Bibliothek finden, die genau Ihren Bedürfnissen entspricht. Die Genauigkeit im Finanzbereich wird von (menschlichen) Normungsgremien definiert, und diese haben sehr spezifische lokale (sowohl zeitlich als auch geografisch) Regeln für die Durchführung von Berechnungen. Dinge wie die korrekte Rundung sind in den einfachen numerischen Datentypen in .Net nicht enthalten. Die Fähigkeit, Berechnungen durchzuführen, ist nur ein sehr kleiner Teil des Puzzles.
Ich werde nicht viele gute (und einige schlechte) Informationen wiederholen, die bereits in anderen Antworten und Kommentaren beantwortet wurden, aber ich werde Ihre Folgefrage mit einem Tipp beantworten:
Wann würde jemand so ein Gerät benutzen?
Verwenden Sie Dezimalzahlen für gezählt Werte
Verwenden Sie float/double für gemessen Werte
Einige Beispiele:
Geld (zählen wir Geld oder messen wir Geld?)
Entfernung (zählen wir die Entfernung oder messen wir sie? *)
Punkte (zählen wir Punkte oder messen wir Punkte?)
Wir zählen immer Geld und sollten es nie messen. Wir messen normalerweise die Entfernung. Wir zählen oft Spielstände.
* In einigen Fällen würde ich das als Sollentfernung können wir in der Tat die Entfernung "zählen" wollen. Vielleicht haben wir es zum Beispiel mit Landesschildern zu tun, die Entfernungen zu Städten angeben, und wir wissen, dass diese Entfernungen nie mehr als eine Dezimalstelle haben (xxx.x km).
Diese Antwort gefällt mir sehr gut, insbesondere die Frage "Zählen oder messen wir Geld?". Abgesehen von Geld fällt mir jedoch nichts ein, was "gezählt" wird und nicht einfach eine ganze Zahl ist. Ich habe einige Anwendungen gesehen, die Dezimalzahlen verwenden, einfach weil Double zu wenige signifikante Ziffern. Mit anderen Worten: Dezimal könnte verwendet werden, weil C# keine Vierfaches Typ de.wikipedia.org/wiki/vierfachgenaues_Gleitkommaformat
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.
3 Stimmen
Interessanter Artikel zetcode.com/lang/csharp/datatypes
0 Stimmen
Verwandt: sandbox.mc.edu/~bennet/cs110/flt/dtof.html
8 Stimmen
Sie können Decimal nicht für die Interoperabilität mit nativem Code verwenden, da es sich um eine .net-spezifische Implementierung handelt, während Float- und Double-Zahlen von CPUs direkt verarbeitet werden können.