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
7 Ziffern der Genauigkeit
double
hat eine Genauigkeit von etwa 15 Ziffern
decimal
hat eine Genauigkeit von etwa 28 Ziffern
Wenn Sie eine höhere Genauigkeit benötigen, verwenden Sie double anstelle von float. In modernen CPUs haben beide Datentypen fast die gleiche Leistung. Der einzige Vorteil von float ist, dass sie weniger Platz benötigen. Das ist aber nur von Bedeutung, wenn Sie viele davon haben.
Ich fand das sehr interessant. Was jeder Informatiker über Fließkommaarithmetik wissen sollte
@RogerLipscombe: Ich würde in Betracht ziehen double
in Buchhaltungsanwendungen in den Fällen (und im Grunde nur in den Fällen), in denen kein Integer-Typ größer als 32 Bit verfügbar war, und die double
wurde wie ein 53-Bit-Integer-Typ verwendet (z. B. um eine ganze Anzahl von Pennies oder eine ganze Anzahl von Hundertsteln eines Cent zu speichern). Heutzutage wird so etwas kaum noch verwendet, aber viele Sprachen haben die Fähigkeit erlangt, Fließkommazahlen mit doppelter Genauigkeit zu verwenden, lange bevor sie die 64-Bit- (oder in manchen Fällen sogar die 32-Bit-!) Ganzzahl-Mathematik eingeführt haben.
Ihre Antwort impliziert, dass Präzision der einzige Unterschied zwischen diesen Datentypen ist. Da binäre Fließkommaarithmetik typischerweise implementiert wird in Hardware-FPU Die Leistung ist ein wesentlicher Unterschied. Dies mag für einige Anwendungen unbedeutend sein, ist aber für andere entscheidend.
@supercat double ist niemals ordnungsgemäß in Buchhaltungsanwendungen. Denn Double kann dezimale Werte nur annähernd darstellen (auch innerhalb des Bereichs seiner eigenen Genauigkeit). Das liegt daran, dass Double die Werte in einem Basis-2 (binär)-zentrierten Format speichert.
Niemand hat erwähnt, dass
In den Standardeinstellungen verwenden Floats (System.Single) und Doubles (System.Double) nie Überlaufprüfung, während Decimal (System.Decimal) immer eine Überlaufprüfung verwenden.
Ich meine
decimal myNumber = decimal.MaxValue;
myNumber += 1;
wirft OverflowException .
Aber das ist nicht der Fall:
float myNumber = float.MaxValue;
myNumber += 1;
&
double myNumber = double.MaxValue;
myNumber += 1;
float.MaxValue+1 == float.MaxValue
ebenso wie decimal.MaxValue+0.1D == decimal.MaxValue
. Vielleicht meinten Sie etwas wie float.MaxValue*2
?
Ganzzahlen sind, wie bereits erwähnt, ganze Zahlen. Sie können nicht den Punkt etwas, wie .7, .42 und .007 speichern. Wenn Sie Zahlen speichern müssen, die nicht ganzzahlig sind, benötigen Sie einen anderen Variablentyp. Sie können den Double-Typ oder den Float-Typ verwenden. Diese Variablentypen werden auf genau dieselbe Weise eingerichtet: Anstatt das Wort int
tippen Sie double
o float
. Etwa so:
float myFloat;
double myDouble;
( float
ist die Abkürzung für "floating point" und bedeutet einfach eine Zahl mit einem Punkt am Ende).
Der Unterschied zwischen den beiden liegt in der Größe der Zahlen, die sie speichern können. Für float
können Sie Ihre Nummer mit bis zu 7 Ziffern versehen. Für double
s können Sie bis zu 16 Ziffern haben. Um genauer zu sein, hier ist die offizielle Größe:
float: 1.5 × 10^-45 to 3.4 × 10^38
double: 5.0 × 10^-324 to 1.7 × 10^308
float
ist eine 32-Bit-Zahl, und double
ist eine 64-Bit-Zahl.
Doppelklicken Sie auf Ihre neue Schaltfläche, um den Code zu erhalten. Fügen Sie die folgenden drei Zeilen zum Code der Schaltfläche hinzu:
double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());
Halten Sie Ihr Programm an und kehren Sie zum Codierfenster zurück. Ändern Sie diese Zeile:
myDouble = 0.007;
myDouble = 12345678.1234567;
Führen Sie Ihr Programm aus und klicken Sie auf die Doppeltaste. Im Meldungsfenster wird die Zahl korrekt angezeigt. Fügen Sie jedoch eine weitere Zahl am Ende hinzu, und C# rundet erneut auf oder ab. Die Moral von der Geschicht': Wenn Sie Genauigkeit wollen, seien Sie vorsichtig beim Runden!
Das von Ihnen erwähnte "Punkt-irgendwas" wird allgemein als "Bruchteil" einer Zahl bezeichnet. "Fließkomma" bedeutet nicht "eine Zahl mit einem Punkt am Ende"; stattdessen unterscheidet "Fließkomma" die Art der Zahl im Gegensatz zu einer "Festkomma"-Zahl (die auch einen gebrochenen Wert speichern kann); der Unterschied ist, ob die Genauigkeit fest oder fließend ist. -- Fließkommazahlen bieten einen viel größeren dynamischen Wertebereich (Min und Max) auf Kosten der Genauigkeit, während Festkommazahlen eine konstante Genauigkeit auf Kosten des Wertebereichs bieten.
Und ob sie das können! Sie haben auch einige "magische" Werte wie Unendlich, Negativ Unendlich und NaN (keine Zahl), die sehr nützlich sind, um vertikale Linien bei der Berechnung von Steigungen zu erkennen... Wenn Sie sich entscheiden müssen, ob Sie float.TryParse, double.TryParse oder decimal.TryParse aufrufen sollen (um z. B. zu erkennen, ob eine Zeichenkette eine Zahl ist), empfehle ich double oder float, da sie "Infinity", "-Infinity" und "NaN" richtig analysieren, während decimal dies nicht tut.
Zusammenstellung schlägt nur dann fehl, wenn Sie versuchen, ein Literal zu teilen decimal
durch Null (CS0020), und dasselbe gilt für ganzzahlige Literale. Wenn jedoch ein dezimaler Wert zur Laufzeit durch Null geteilt wird, erhalten Sie eine Ausnahme und keinen Kompilierfehler.
Der Unterschied ist mehr als nur Präzision. -- decimal
wird tatsächlich im Dezimalformat gespeichert (im Gegensatz zur Basis 2, so dass keine Ziffern durch die Konvertierung zwischen den beiden numerischen Systemen verloren gehen oder gerundet werden); zusätzlich, decimal
hat kein Konzept für spezielle Werte wie NaN, -0, , oder -.
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.