Frage Unterschied zwischen Dezimal, Float und Double in .NET?


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

Wann würde jemand eines davon benutzen?


1772
2018-03-06 11:31


Ursprung


Antworten:


float und double sind schwebend binär Punkttypen. Mit anderen Worten, sie stellen eine Zahl wie folgt dar:

10001.10010110011

Die Binärzahl und der Ort des Binärpunkts sind beide innerhalb des Wertes codiert.

decimal ist ein schwebend Dezimal Punkttyp. Mit anderen Worten, sie stellen eine Zahl wie folgt dar:

12345.65789

Wiederum die Nummer und der Ort des Dezimal Point sind beide innerhalb des Wertes codiert - das macht was decimal immer noch ein Fließkommatyp anstelle eines Fixpunkttyps.

Es ist wichtig zu beachten, dass Menschen gewohnt sind, Nicht-Ganzzahlen in dezimaler Form darzustellen und exakte Ergebnisse in dezimalen Darstellungen zu erwarten; Nicht alle Dezimalzahlen sind im binären Fließkomma genau darstellbar - zum Beispiel 0.1 - wenn Sie also einen binären Gleitkommawert verwenden, erhalten Sie eine Annäherung an 0.1. Sie erhalten immer noch Näherungen, wenn Sie einen Gleitpunkt verwenden - das Ergebnis der Division von 1 durch 3 kann beispielsweise nicht genau dargestellt werden.

Was zu verwenden, wenn:

  • Für Werte, die "natürlich exakte Dezimalzahlen" sind, ist es gut zu verwenden decimal. Dies ist normalerweise für alle Konzepte geeignet, die von Menschen erfunden wurden: finanzielle Werte sind das offensichtlichste Beispiel, aber es gibt auch andere. Berücksichtigen Sie beispielsweise die Punktzahl für Taucher oder Eisläufer.

  • Für Werte, die mehr Artefakte der Natur sind, die nicht wirklich gemessen werden können genau sowieso, float/double sind passender. Zum Beispiel würden wissenschaftliche Daten normalerweise in dieser Form dargestellt. Hier sind die ursprünglichen Werte nicht von Anfang an "dezimal genau", daher ist es nicht wichtig, dass die erwarteten Ergebnisse die "Dezimalgenauigkeit" beibehalten. Fließende binäre Punkttypen arbeiten viel schneller als Dezimalstellen.


1963
2018-03-06 11:56



Präzision ist der Hauptunterschied.

Schweben - 7 Ziffern (32 Bit)

Doppelt-15-16 Ziffern (64 Bit)

Dezimal -28-29 signifikante Ziffern (128 Bit)

Dezimalzahlen haben eine viel höhere Genauigkeit und werden normalerweise in Finanzanwendungen verwendet, die ein hohes Maß an Genauigkeit erfordern. Dezimalstellen sind viel langsamer (bis zu 20x in manchen Tests) als ein Double / Float.

Dezimale und Floats / Doubles können nicht ohne eine Besetzung verglichen werden, während Floats und Doubles dies können. Dezimalzahlen ermöglichen auch die Codierung oder abschließende Nullen.

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

894
2018-03-06 11:33



Die Dezimalstruktur ist strikt auf finanzmathematische Berechnungen ausgerichtet, die eine Rundungsgenauigkeit relativ intolerant sind. Für wissenschaftliche Anwendungen sind Dezimale jedoch aus mehreren Gründen nicht geeignet:

  • Ein gewisser Genauigkeitsverlust ist in vielen wissenschaftlichen Berechnungen aufgrund der praktischen Grenzen des zu messenden physikalischen Problems oder Artefakts akzeptabel. Genauigkeitsverlust ist im Finanzbereich nicht akzeptabel.
  • Dezimal ist für die meisten Operationen viel (viel) langsamer als float und double, hauptsächlich weil Fließkommaoperationen binär ausgeführt werden, während Dezimalkram in der Basis 10 erledigt wird (dh Floats und Doubles werden von der FPU-Hardware wie MMX / SSE gehandhabt) , während Dezimalstellen in Software berechnet werden).
  • Dezimal hat einen unannehmbar kleineren Wertebereich als doppelt, trotz der Tatsache, dass es mehr Stellen der Genauigkeit unterstützt. Daher kann Decimal nicht verwendet werden, um viele wissenschaftliche Werte zu repräsentieren.

65
2018-04-13 13:55



enter image description here

Für weitere Informationen können Sie zur Quelle dieses Bildes gehen:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5


54
2018-06-07 12:50



float 7 Stellen der Präzision

double hat ungefähr 15 Stellen der Präzision

decimal hat ungefähr 28 Stellen der Genauigkeit

Wenn Sie eine bessere Genauigkeit benötigen, verwenden Sie double statt float. In modernen CPUs haben beide Datentypen fast die gleiche Leistung. Der einzige Vorteil von Float ist, dass sie weniger Platz benötigen. Praktisch zählt nur, wenn Sie viele von ihnen haben.

Ich fand das interessant. Was jeder Informatiker über Gleitkommaarithmetik wissen sollte


39
2017-08-29 00:06



Niemand hat das erwähnt

In den Standardeinstellungen werden Floats (System.Single) und Doubles (System.Double) niemals verwendet   Überlaufprüfung, während Decimal (System.Decimal) immer verwendet wird   Überlaufprüfung

ich meine

decimal myNumber = decimal.MaxValue;
myNumber += 1;

wirft ÜberlaufException.

Aber diese nicht:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

28
2018-01-02 13:12



  1. Double und Float können bei der Kompilierung und Laufzeit durch eine Ganzzahl Null ohne Ausnahme geteilt werden.
  2. Dezimal kann nicht durch Ganzzahl Null geteilt werden. Die Erstellung wird immer fehlschlagen, wenn Sie das tun.

24
2017-07-29 07:21



Ich werde nicht viele gute (und einige schlechte) Informationen wiederholen, die bereits in anderen Antworten und Kommentaren beantwortet wurden, aber ich beantworte Ihre Follow-up-Frage mit einem Tipp:

Wann würde jemand eines davon benutzen?

Verwenden Sie Dezimal für gezählt Werte

Verwenden Sie float / double für gemessen Werte

Einige Beispiele:

  • Geld (zählen wir Geld oder messen Geld?)

  • Abstand (Zählen wir Abstand oder messen Abstand? *)

  • Scores (zählen wir Scores oder messen Scores?)

Wir zählen immer Geld und sollten es niemals messen. Wir messen normalerweise die Entfernung. Wir zählen oft Punkte.

* In einigen Fällen, was ich nennen würde nominale EntfernungVielleicht wollen wir die Entfernung tatsächlich "zählen". Zum Beispiel haben wir es mit Landzeichen zu tun, die Entfernungen zu Städten zeigen, und wir wissen, dass diese Entfernungen nie mehr als eine Dezimalziffer (xxx.x km) haben.


24
2018-04-22 15:18



Die Variablentypen Dezimal, Double und Float unterscheiden sich in der Art, in der sie die Werte speichern. Präzision ist der Hauptunterschied, bei dem Float ein Gleitkomma-Datentyp mit einfacher Genauigkeit (32 Bit), Double ein Gleitkomma-Datentyp mit doppelter Genauigkeit (64 Bit) und Dezimalzahl ein 128-Bit-Fließkomma-Datentyp ist.

Float - 32 Bit (7 Ziffern)

Double - 64 Bit (15-16 Ziffern)

Dezimal - 128 Bit (28-29 signifikante Stellen)

Der Hauptunterschied besteht darin, dass Floats und Doubles binäre Gleitkommatypen sind und ein Dezimalwert den Wert als Gleitkommaart speichert. Dezimale haben daher eine viel höhere Präzision und werden normalerweise in monetären (finanziellen) oder wissenschaftlichen Berechnungsanwendungen verwendet, die ein hohes Maß an Genauigkeit erfordern. In der Leistung sind Dezimalzahlen jedoch langsamer als Double- und Float-Typen.

Dezimal kann 100% genau jede Zahl innerhalb der Genauigkeit des Dezimalformats darstellen, während Float und Double, nicht alle Zahlen genau wiedergeben können, gerade Zahlen, die innerhalb ihrer jeweiligen Formatpräzision sind.

Dezimal

Im Fall von Finanzanwendungen oder wissenschaftlichen Berechnungen ist es besser, Dezimaltypen zu verwenden, da es Ihnen ein hohes Maß an Genauigkeit bietet und Rundungsfehler leicht zu vermeiden ist

Doppelt

Doppeltypen sind wahrscheinlich der am häufigsten verwendete Datentyp für reale Werte, außer Geld zu handhaben.

Schweben

Es wird hauptsächlich in Grafikbibliotheken verwendet, da sehr hohe Anforderungen an die Verarbeitungsleistung gestellt werden, sowie Situationen, in denen Rundungsfehler auftreten können.


23
2018-06-19 04:34



Ganze Zahlen sind, wie erwähnt, ganze Zahlen. Sie können den Punkt nicht speichern, z. B. .7, .42 und .007. Wenn Sie Zahlen speichern müssen, die keine ganzen Zahlen sind, benötigen Sie einen anderen Variablentyp. Sie können den Double-Typ oder den Float-Typ verwenden. Sie setzen diese Arten von Variablen auf genau die gleiche Weise: anstatt das Wort zu verwenden int, du tippst double oder float. So was:

float myFloat;
double myDouble;

(float ist die Abkürzung für "Gleitkomma" und bedeutet einfach eine Zahl mit einem Punkt am Ende.

Der Unterschied zwischen den beiden liegt in der Größe der Zahlen, die sie halten können. Zum floatSie können bis zu 7 Ziffern in Ihrer Nummer haben. Zum doubles, können Sie bis zu 16 Ziffern haben. Um genau 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-Nummer und double ist eine 64-Bit-Nummer.

Doppelklicken Sie auf Ihre neue Schaltfläche, um den Code zu erhalten. Fügen Sie Ihrem Schaltflächencode die folgenden drei Zeilen hinzu:

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

Halten Sie Ihr Programm an und kehren Sie zum Codierungsfenster zurück. Ändern Sie diese Zeile:

myDouble = 0.007;
myDouble = 12345678.1234567;

Führen Sie Ihr Programm aus und klicken Sie auf Ihren Doppelknopf. Das Nachrichtenfeld zeigt die Nummer korrekt an. Fügen Sie am Ende jedoch eine weitere Zahl hinzu, und C # wird erneut auf- oder abgerundet. Die Moral ist, wenn Sie Genauigkeit wollen, seien Sie vorsichtig beim Runden!


22
2018-05-22 12:05



Das war ein interessanter Thread für mich, denn heute haben wir gerade einen ekligen kleinen Fehler gehabt decimal weniger Präzision als a float.

In unserem C # -Code lesen wir numerische Werte aus einer Excel-Tabelle und konvertieren sie in eine decimal, dann sende ich das decimal zurück zu einem Dienst, um in ein zu speichern SQL Server Datenbank.

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}

Jetzt für fast alles unserer Excel-Werte, das hat wunderbar funktioniert. Aber für einige, sehr kleine Excel-Werte, mit decimal.TryParse verlor den Wert vollständig. Ein solches Beispiel ist

  • cellValue = 0.00006317592

  • Decimal.TryParse (cellValue.ToString (), out-Wert); // würde zurückkehren 0

Die Lösung war, die Excel - Werte bizarr zu konvertieren double zuerst und dann in ein decimal:

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    double valueDouble = 0;
    double.TryParse(cellValue.ToString(), out valueDouble);
    decimal value = (decimal) valueDouble;
    …
}

Obwohl double hat weniger Präzision als a decimal, das sorgte tatsächlich dafür, dass kleine Zahlen immer noch erkannt würden. Aus irgendeinem Grund, double.TryParse konnte tatsächlich so kleine Zahlen abrufen, während decimal.TryParse würde sie auf Null setzen.

Ungerade. Sehr komisch.


12
2018-04-16 09:23