2456 Stimmen

Unterschied zwischen Dezimal, Float und Double in .NET?

Was ist der Unterschied zwischen decimal , float y double in .NET?

Wann würde jemand so ein Gerät benutzen?

3 Stimmen

Interessanter Artikel zetcode.com/lang/csharp/datatypes

0 Stimmen

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.

2586voto

Jon Skeet Punkte 1325502

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.

94 Stimmen

float / double stellen Zahlen normalerweise nicht als 101.101110 Normalerweise wird es als etwas wie folgt dargestellt 1101010 * 2^(01010010) - ein Exponent

98 Stimmen

@Hazzard: Das ist es, was der Teil "und die Lage des Binärpunkts" in der Antwort bedeutet.

147 Stimmen

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.

1282voto

cgreeno Punkte 30732

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

5 Stimmen

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

73 Stimmen

@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.

4 Stimmen

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).

130voto

+---------+----------------+---------+----------+---------------------------------------------------------+
| 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                                           |
+---------+----------------+---------+----------+---------------------------------------------------------+

Für weitere Informationen siehe hier .

12 Stimmen

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).

2 Stimmen

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

3 Stimmen

Dezimal sind 128 Bits ... das heißt, sie belegen 16 Bytes, nicht 12

106voto

Mark Jones Punkte 1854

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:

  • Ein gewisser Präzisionsverlust ist bei vielen wissenschaftlichen Berechnungen aufgrund der praktischen Grenzen des zu messenden physikalischen Problems oder Artefakts akzeptabel. Im Finanzwesen ist ein Verlust an Präzision nicht akzeptabel.
  • Dezimal ist bei den meisten Operationen viel (sehr viel) langsamer als Float und Double, vor allem weil Float-Operationen im Binärformat durchgeführt werden, während Decimal-Operationen zur Basis 10 durchgeführt werden (d.h. Floats und Doubles werden von der FPU-Hardware, wie MMX/SSE, verarbeitet, während Dezimalzahlen in der Software berechnet werden).
  • Decimal hat einen inakzeptabel kleineren Wertebereich als Double, obwohl es mehr Stellen der Genauigkeit unterstützt. Daher kann Decimal nicht zur Darstellung vieler wissenschaftlicher Werte verwendet werden.

7 Stimmen

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.

97voto

tomosius Punkte 1120

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).

4 Stimmen

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.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