Ich möchte wissen, welche Konvertierung für eine einfache mathematische Operation besser ist (hinsichtlich Leistung / Geschwindigkeit und Präzision / möglichst wenig Verlust) und was unterscheidet sie?
Beispiel:
%Vor%Eigentlich geht es bei meiner Frage um die Konvertierung, nicht um den Typ selbst.
BEARBEITEN
Als Antwort auf Ihre völlig veränderte Frage:
Die erste Zeile double double1 = integer1 / (5 * integer2);
hat eine ganzzahlige Division, also tu das nicht.
Auch die Zeile var double8 = Convert.ToDouble(integer1 / (5 * integer2));
führt eine Integer-Division durch, bevor das Ergebnis in ein Double konvertiert wird. Tun Sie das auch nicht.
Abgesehen davon rufen die verschiedenen Ansätze, die Sie auflisten, die IL-Anweisung Conv.R8
einmal für jede Zeile in Ihrem Beispielcode auf.
Der einzige wirkliche Unterschied ist, dass Convert.ToDouble()
einen Methodenaufruf macht, um dies zu tun, also sollten Sie das vermeiden.
Die Ergebnisse für jede andere Zeile als double1
und double8
sind identisch.
Sie sollten also wahrscheinlich die einfachste Variante verwenden: var double2 = integer1 / (5.0 * integer2);
In einer komplizierteren Situation sollten Sie Ihren Code überprüfen, um festzustellen, ob es Unterschiede gibt.
Bei den Unterschieden zwischen Ihren Codezeilen handelt es sich nicht um Konvertierungen, einige von ihnen sind völlig unterschiedliche Dinge und die Werte sind nicht die gleichen.
%Vor% 5 * interger2
gibt eine int
, int
dividiert int
gibt eine int
, und Sie weisen den Wert int
einer float
-Variable zu, indem Sie die implizite Konvertierung verwenden, weil int
eine kleine hat Bereich als float
. float float1 = 1 / (5 * 2)
, Sie erhalten System.Single
0 als Ergebnis.
5.0
ist im Wesentlichen 5.0d
, also der Typ von float2
ist System.Double
, var float2 = 1 / (5.0 * 2)
Sie erhalten als Ergebnis eine System.Double
0.1.
Wenn Sie dieselben Werte oben verwenden, erhalten Sie System.Single
0.1, was wahrscheinlich das ist, was Sie wollen.
Sie erhalten dasselbe wie Punkt 3. Der Unterschied ist, dass item3 int divides by float
ist, während item4 float divides by int
ist.
Die drei sind fast gleich wie Punkt 3, es berechnet ein int divides by float
, nur verschiedene Möglichkeiten, den Teiler zu bauen.
Die beiden geben Ihnen System.Decimal
-Werte, die eine höhere Genauigkeit haben. Item8 hat das gleiche Problem wie Item1, Sie erhalten 0, weil der Parameter von Convert.ToDecimal
ein int
0 ist.
Anstelle von float / decimal doppel:
Eine allgemeinere Antwort für die generische Frage "Dezimal vs Doppelt": Dezimal für monetäre Berechnungen, um die Genauigkeit zu erhalten, Doppelt für wissenschaftliche Berechnungen, die nicht von kleinen Unterschieden beeinflusst werden. Da Double ein Typ ist, der nativ für die CPU ist (die interne Repräsentation ist in der Basis 2 gespeichert), sind Berechnungen mit Double besser als Dezimal (was intern in der Basis 10 dargestellt wird).
Tags und Links c# type-conversion precision numeric