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.

59voto

CharithJ Punkte 44196

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

1 Stimmen

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

1 Stimmen

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.

6 Stimmen

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

48voto

GorkemHalulu Punkte 2705

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;

2 Stimmen

float.MaxValue+1 == float.MaxValue ebenso wie decimal.MaxValue+0.1D == decimal.MaxValue . Vielleicht meinten Sie etwas wie float.MaxValue*2 ?

0 Stimmen

@supercar Aber es stimmt nicht, dass decimal.MaxValue + 1 == decimal.MaxValue

0 Stimmen

@supercar decimal.MaxValue + 0.1m == decimal.MaxValue ok

31voto

daniel Punkte 375

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!

4 Stimmen

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.

29voto

xport Punkte 6865
  1. Double und Float können sowohl bei der Kompilierung als auch zur Laufzeit ohne Ausnahme durch die ganze Zahl Null geteilt werden.
  2. Dezimal kann nicht durch die ganze Zahl Null geteilt werden. Die Kompilierung wird immer fehlschlagen, wenn Sie das tun.

6 Stimmen

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.

2 Stimmen

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.

0 Stimmen

@BrainSlugs83 Es kann jedoch sein, dass Sie "Infinity" oder "NaN" je nach Kontext nicht parsen wollen. Scheint eine gute Möglichkeit zu sein, Benutzereingaben auszunutzen, wenn der Entwickler nicht streng genug ist.

19voto

Mukesh Kumar Punkte 2244
  • Float: ±1,5 x 10^-45 bis ±3,4 x 10^38 (~7 signifikante Zahlen)
  • doppelt: ±5,0 x 10^-324 bis ±1,7 x 10^308 (15-16 signifikante Stellen)
  • Dezimal: ±1,0 x 10^-28 bis ±7,9 x 10^28 (28-29 signifikante Stellen)

11 Stimmen

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