Ich habe in verschiedenen Post auf Stackoverflow und in der C # -Dokumentation gelesen, dass das Konvertieren von long
(oder eines anderen Datentyps, der eine Zahl darstellt) in double
die Genauigkeit verliert. Dies ist offensichtlich aufgrund der Darstellung von Gleitkommazahlen.
Meine Frage ist: Wie groß ist der Genauigkeitsverlust, wenn ich eine größere Zahl in double
umwandle? Muss ich Unterschiede erwarten, die größer als +/- X sind?
Der Grund, warum ich das wissen möchte, ist, dass ich mich mit einem kontinuierlichen Zähler beschäftigen muss, der ein long
ist. Dieser Wert wird von meiner Anwendung als string
gelesen, muss gecastet werden und muss z. 10 oder eine andere kleine Nummer und wird dann weiter verarbeitet.
Würde decimal
für diese Aufgabe besser geeignet sein?
Das Konvertieren von
long
(oder eines anderen Datentyps, der eine Zahl darstellt) indouble
verliert die Genauigkeit. Dies ist offensichtlich aufgrund der Darstellung von Gleitkommazahlen.
Dies ist weniger offensichtlich als es scheint, da der Präzisionsverlust vom Wert von long
abhängt. Für Werte zwischen -2 <52> und <52> gibt es überhaupt keinen Präzisionsverlust.
Wie groß ist der Genauigkeitsverlust, wenn ich eine größere Zahl in eine doppelte umwandele? Muss ich mit größeren Abweichungen rechnen als +/- X
?
Bei Zahlen mit einer Stärke über 2 52 werden Sie einen Präzisionsverlust erleiden, abhängig davon, wie viel Sie über die 52-Bit-Grenze hinausgehen. Wenn der absolute Wert von long
beispielsweise in 58 Bits passt, ist die Größe des Präzisionsverlusts 58-52 = 6 Bits oder +/- 64.
Würde
decimal
für diese Aufgabe besser geeignet sein?
decimal
hat eine andere Darstellung als double
und verwendet eine andere Basis. Da Sie planen, Ihre Nummer durch "kleine Zahlen" zu teilen, würden verschiedene Darstellungen Ihnen unterschiedliche Fehler bei der Division geben. Genauer gesagt ist double
besser bei der Division durch Potenzen von zwei (2, 4, 8, 16 usw.), da eine solche Division durch Subtrahieren vom Exponenten erreicht werden kann, ohne die Mantisse zu berühren. In ähnlicher Weise würde ein großer decimal
s keinen Verlust von signifikanten Ziffern erleiden, wenn er durch zehn, hundert usw. dividiert wird.
long
long
ist ein 64-Bit-Integer-Typ und kann Werte von -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807 (max. 19 Ziffern) enthalten.
double
double
ist ein 64-Bit-Gleitkommatyp mit einer Genauigkeit von 15 bis 16 Ziffern. So können Daten sicher verloren gehen, wenn Ihre Zahlen größer als 100.000.000.000.000 sind.
decimal
decimal
ist ein 128-Bit-Dezimaltyp und kann bis zu 28-29 Ziffern enthalten. Es ist also immer sicher, long
auf decimal
zu setzen.
Ich würde Ihnen raten, die genauen Erwartungen über die Zahlen herauszufinden, mit denen Sie arbeiten werden. Dann können Sie eine fundierte Entscheidung bei der Auswahl des geeigneten Datentyps treffen. Da Sie Ihre Zahlen aus einer Zeichenfolge lesen, ist es nicht möglich, dass sie sogar größer als 28 Ziffern sind? In diesem Fall funktioniert keiner der aufgeführten Typen für Sie und Sie müssen stattdessen eine BigInt-Implementierung verwenden.
Tags und Links c# casting double long-integer