Frage

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

Wenn jemand eine von diesen benutzen?

War es hilfreich?

Lösung

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

10001.10010110011

Die binäre Zahl und die Position des binären Punktes werden sowohl innerhalb des Wertes codiert wird.

decimal ist ein floating dezimal Punkttyp . Mit anderen Worten, sie stellen eine Zahl wie folgt:

12345.65789

Auch die Anzahl und die Lage der dezimal Punkt sind sowohl innerhalb der Wert codiert -. Das ist, was decimal macht immer noch einen Gleitkommatyps anstelle eines festen Punkt Typ

Die wichtige Sache zu beachten ist, dass die Menschen zu repräsentieren nicht-Zahlen in Dezimal-Form verwendet werden, und genaue Ergebnisse in Dezimaldarstellungen erwarten; nicht alle Dezimalzahlen sind exakt darstellbare in binären Gleitkomma - 0,1, zum Beispiel - wenn Sie also eine binäre Gleitkommazahl verwenden werden Sie tatsächlich eine Annäherung an 0,1 erhalten. Sie werden immer noch Annäherungen erhalten, wenn ein Fließkomma als auch mit -. Dem Ergebnis der Division 1 durch 3 nicht exakt dargestellt werden, zum Beispiel

Als für das, was zu verwenden, wenn:

  • Für Werte, die „natürlich genaue Dezimalstellen“ es ist gut zu bedienen decimal sind. Dies ist in der Regel eignet sich für alle Konzepte von Menschen erfunden: Finanzwerte das offensichtlichste Beispiel sind, aber es gibt auch andere. Betrachten Sie die Punktzahl gegeben Taucher oder Eisläufer, zum Beispiel.

  • Für Werte, die mehr Artefakte der Natur sind, die nicht wirklich gemessen werden kann genau wie auch immer, float / double mehr geeignet ist. Zum Beispiel würden wissenschaftliche Daten in der Regel in dieser Form dargestellt werden. Hier werden die ursprünglichen Werte nicht „decimally genau“ mit zu beginnen, so ist es nicht wichtig, dass die erwarteten Ergebnisse, die die „Dezimal Genauigkeit“ zu halten. Schwimmdock Binärpunkts Typen sind viel schneller zu verarbeiten als Dezimalzahlen.

Andere Tipps

Präzision ist der Hauptunterschied.

Float - 7 Stellen (32 bit)

Doppel -15-16 Ziffern (64 bit)

Dezimal -28-29 signifikanten Stellen (128 bit )

Decimals haben viele höhere Präzision und werden in der Regel innerhalb von Finanz Anwendungen verwendet, die ein hohes Maß an Genauigkeit erfordern. Dezimalzahlen sind viel langsamer (bis zu 20x mal in einigen Tests) als Doppel / Schwimmer.

Dezimalzahlen und Floats / Double können nicht ohne eine Guss während Floats und Doubles können verglichen werden. Dezimalzahlen ermöglichen auch die Codierung oder nachgestellte 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

Die Dezimal-Struktur ist streng auf finanzielle Berechnungen ausgerichtet Genauigkeit erfordern, die relativ intolerant die Rundung ist. Dezimalzahlen sind für wissenschaftliche Anwendungen nicht ausreichend, jedoch aus mehreren Gründen:

  • Ein gewisser Verlust an Genauigkeit akzeptabel ist in vielen wissenschaftlichen Berechnungen aufgrund der praktischen Grenzen des physikalischen Problems oder Artefakt gemessen wird. Der Verlust der Genauigkeit ist nicht akzeptabel im Finanzbereich.
  • Decimal ist viel (viel) langsamer ist als Schwimmer und doppelt für die meisten Operationen, vor allem weil Gleitkommaoperationen in binären getan werden, während Decimal Material in der Basis 10 (dh Schwimmern und Doppel erfolgt durch die FPU-Hardware gehandhabt werden, wie beispielsweise MMX / SSE, während Dezimalstellen in Software berechnet).
  • Dezimal hat einen unannehmbar kleineren Wertebereich als das Doppelte, trotz der Tatsache, dass es mehr Stellen an Präzision unterstützt. Daher kann Dezimal nicht verwendet werden, viele wissenschaftliche Werte darzustellen.
+---------+----------------+---------+----------+---------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                             |
| Type    | (System) type  |         | Occupied |                                             |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                 |
| short   | System.Int16   | Yes     | 2        | -32768 to 32767                             |
| int     | System.Int32   | Yes     | 4        | -2147483648 to 2147483647                   |
| long    | System.Int64   | Yes     | 8        | -9223372036854775808 to 9223372036854775807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                    |
| ushort  | System.Uint16  | No      | 2        | 0 to 65535                                  |
| uint    | System.UInt32  | No      | 4        | 0 to 4294967295                             |
| ulong   | System.Uint64  | No      | 8        | 0 to 18446744073709551615                   |
| float   | System.Single  | Yes     | 4        | Approximately ±1.5 x 10-45 to ±3.4 x 1038   |
|         |                |         |          |  with 7 significant figures                 |
| double  | System.Double  | Yes     | 8        | Approximately ±5.0 x 10-324 to ±1.7 x 10308 |
|         |                |         |          |  with 15 or 16 significant figures          |
| decimal | System.Decimal | Yes     | 12       | Approximately ±1.0 x 10-28 to ±7.9 x 1028   |
|         |                |         |          |  with 28 or 29 significant figures          |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)              |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                               |
+---------+----------------+---------+----------+---------------------------------------------+

Weitere Informationen finden Sie unter:
http: //social.msdn .microsoft.com / Foren / en-US / csharpgeneral / thread / 921a8ffc-9829-4145-bdc9-a96c1ec174a5

float 7 Ziffern der Präzision

double hat etwa 15 Stellen genau

decimal hat etwa 28 Stellen genau

Wenn Sie eine höhere Genauigkeit benötigen, verwenden Sie doppelte statt Schwimmer. In der modernen CPUs haben beiden Datentypen fast die gleiche Leistung. Die einzige benifit Schwimmer zu verwenden, ist sie weniger Platz in Anspruch nehmen. Praktisch wichtig ist nur, wenn Sie viele von ihnen bekommen haben.

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

Ich werde nicht Tonnen gut (und einige schlecht) Informationen wiederholen, die bereits in anderen Antworten und Kommentaren beantworten, aber ich werde Ihre followup Frage mit einer Spitze beantworten:

  

Wenn jemand eine dieser verwenden würde?

Mit dezimal für gezählt Werte

Mit float / double für gemessen Werte

Einige Beispiele:

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

  • Abstand (tun wir Abstand oder messen Sie die Entfernung zählen? *)

  • Partituren (tun wir Partituren oder messen Partituren? Count)

Wir rechnen immer Geld und sollte es nie messen. Wir messen in der Regel entfernt. Wir zählen oft Partituren.

* In einigen Fällen, was ich nennen würde Nennabstand , so können wir in der Tat auf 'count' Abstand wollen. Zum Beispiel, vielleicht haben wir es mit Land Zeichen, die Entfernungen zu den Städten zeigen, und wir wissen, dass diese Abstände nie mehr als eine Nachkommastelle (xxx.x km) haben.

Niemand hat erwähnt, dass

  

In den Standardeinstellungen Floats (System.Single) und Doppel (System.Double) niemals verwenden   Überlauf überprüft, während Dezimal (System.Decimal) immer verwenden   Überlaufprüfung.

ich meine

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

wirft Overflow .

Aber diese nicht:

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

&

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

Zahlen, wie erwähnt wurde, sind ganze zahlen.Sie können nicht speichern, den Punkt so etwas wie .7, .42, und .007.Wenn Sie speichern müssen zahlen, die nicht ganze zahlen, müssen Sie eine andere Art der variable.Sie verwenden können die Typ double oder float-Typ.Sie legen diese Arten von Variablen in genau der gleichen Weise:statt der Verwendung des Wortes int, geben Sie double oder float.Wie diese:

float myFloat;
double myDouble;

(float ist die Abkürzung für "floating point", und bedeutet einfach, dass eine Zahl mit einem Punkt etwas am Ende.)

Der Unterschied zwischen den beiden liegt in der Größe der zahlen, die Sie halten können.Für float, Sie können bis zu 7 Ziffern Ihrer Nummer.Für doubles, Sie können bis zu 16 Ziffern.Um genauer zu sein, hier 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 den neuen button, um den code.Fügen Sie die folgenden drei Zeilen in Ihrem button-code:

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

Stoppen Sie Ihr Programm und kehren zur Codierung Fenster.Ändern Sie diese Zeile:

myDouble = 0.007;
myDouble = 12345678.1234567;

Führen Sie Ihr Programm und klicken Sie mit der Doppel-Taste.Die Nachricht box korrekt zeigt die Anzahl.Hinzufügen einer anderen Nummer am Ende, obwohl, und C# wieder auf-oder abrunden.Die moral der Geschichte ist, wenn Sie möchten, Genauigkeit, vorsichtig sein, Rundung!

  1. Double und Schwimmer können durch ganze Zahl Null ohne Ausnahme sowohl auf Kompilation aufgeteilt werden und Zeit.
  2. Dezimal kann nicht durch ganze Zahl Null geteilt werden. Kompilierung wird immer fehlschlagen, wenn Sie das tun.

Dies ist ein interessanter Thread für mich gewesen, wie heute, haben wir nur einen fiesen kleinen Fehler haben, über decimal mit weniger Präzision als ein float.

In unserem C # -Code, wir numerische Werte aus einer Excel-Tabelle lesen, sie in eine decimal Umwandlung, dann diesen decimal Senden zurück zu einem Dienst in einen SQL Server speichern Datenbank.

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

Nun, für fast alle unsere Excel Werte, arbeitete diese schön. Aber für einige, sehr kleine Excel-Werte mit decimal.TryParse vollständig den Wert verloren. Ein solches Beispiel ist

  • Cellvalue = ,00006317592

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

Die Lösung war bizarr, die Excel-Werte in eine double zu konvertieren zuerst, und dann in eine 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;
    …
}

Auch wenn double weniger Präzision als ein decimal, dies gewährleistet tatsächlich kleine Zahlen noch erkannt werden würde. Aus irgendeinem Grund, double.TryParse war tatsächlich in der Lage solche kleinen Zahlen abzurufen, während decimal.TryParse würde sie auf Null gesetzt.

Odd. Sehr seltsam.

  • float: ± 1,5 x 10 ^ -45 bis ± 3,4 x 10 ^ 38 (~ 7 signifikante Zahlen
  • double: ± 5,0 x 10 ^ -324 bis ± 1,7 x 10 ^ 308 (15-16 signifikante Ziffern)
  • Dezimal: ± 1,0 x 10 ^ -28 bis ± 7,9 x 10 ^ 28 (28-29 signifikante Ziffern)

Für Anwendungen wie Spiele und Embedded-Systeme, in denen Speicher und Performance sind die entscheidenden Kriterien, float ist in der Regel die numerische Art der Wahl, da es schneller ist und die Hälfte der Größe eines Doppels. Die ganzen Zahlen verwendeten die Waffe der Wahl zu sein, aber Floating-Point-Performance hat ganze Zahl in modernen Prozessoren überholt. Dezimal ist direkt aus!

Das Dezimal, Double und Float-Variablen-Typen in der Art und Weise unterscheidet, dass sie die Werte speichern. Präzision ist der Hauptunterschied in dem eine Schwimmer mit einfacher Genauigkeit (32 Bit) Gleitkomma-Datentypen, Doppel- ist eine doppelte Genauigkeit (64 Bit) Gleitkomma-Datentyp und decimal ist ein 128-Bit-Gleitkomma-Datentyp.

Float - 32 Bit (7 Stellen)

Double - 64 Bit (15-16 Stellen)

Dezimal - 128 Bit (28-29 signifikante Stellen)

Mehr über ... die Differenz zwischen Dezimal, Float und Double

Das Problem bei all diesen Arten ist, dass eine gewisse Unschärfen subsistiert UND, dass dieses Problem mit kleinen Dezimalzahlen wie im folgende Beispiel auftreten kann,

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If

Frage: Welcher Wert nicht Blower Variable enthält

Antwort: Auf einer 32-Bit-Maschine Blower enthält TRUE !!!

Wenn ich doppelt ersetzen durch Dezimal, Blower FALSCH enthält, welche die gute Antwort ist.

Im Doppel, das Problem ist, dass Fmittel-FDELTA = 1,09999999999, die niedriger als 1,1 ist.

Achtung: Ich denke, die gleiche Problem kann sicherlich für andere Nummer existiert, weil Dezimal nur ein Doppel mit höherer Genauigkeit und die Präzision hat immer eine Grenze

.

In der Tat, Double, Float und Dezimal entspricht BINARY dezimal in COBOL!

Es ist bedauerlich, dass andere in COBOL implementiert numerischen Typen existieren nicht in .Net. Für diejenigen, die COBOL nicht kennen, gibt es in COBOL folgenden numerischen Typ

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 

In einfachen Worten:

  1. Das Dezimal, Double und Float-Variablen-Typen unterscheiden sich in der Art und Weise, dass sie die Werte speichern.
  2. ist Präzision der Hauptunterschied (Beachten Sie, dass dies nicht der einzige Unterschied), in dem float ist eine einfache Genauigkeit (32 Bit) schwimmend Punkt-Datentyp, Doppel ist eine doppelte Genauigkeit (64 Bit) Gleitkomma-Datentyp und decimal ist ein 128-Bit-Gleitkomma-Datentyp.
  3. Die Übersichtstabelle:

/==========================================================================================
    Type       Bits    Have up to                   Approximate Range 
/==========================================================================================
    float      32      7 digits                     -3.4 × 10 ^ (38)   to +3.4 × 10 ^ (38)
    double     64      15-16 digits                 ±5.0 × 10 ^ (-324) to ±1.7 × 10 ^ (308)
    decimal    128     28-29 significant digits     ±7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
Sie können mehr hier lesen, float , Doppel und dezimal .

Der Hauptunterschied zwischen jedem von ihnen ist die Präzision.

float ist eine 32-bit Nummer, double ist eine 64-bit Zahl und decimal ist eine 128-bit Nummer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top