2016-08-04 19 views
0

Von was ich verstehe Dezimal wird für Präzision verwendet und wird für monetäre Berechnungen empfohlen. Double bietet eine bessere Reichweite, aber weniger Präzision und ist viel schneller als Dezimal.C# Dezimal und Doppel

Was passiert, wenn ich Zeit und Rate habe, fühle ich mich wie doppelt für Zeit und Dezimalzahl für Rate geeignet ist. Ich kann die beiden nicht miteinander kombinieren und Berechnungen ohne Casting durchführen, was einen weiteren Performance-Engpass darstellt. Was ist der beste Ansatz hier? Verwenden Sie einfach Dezimal für Zeit und Rate?

+0

Was meinst du mit der Zeit? Millisekunden? Protokoll ? Zecken? Alle diese Fälle sind lang oder dezimal. – user3185569

+4

Der beste Ansatz hängt von Ihren Anforderungen ab. Wie Sie nicht angegeben haben, haben Sie wahrscheinlich wirklich keine, was Dezimalzahl bedeutet und weitergeht. – Will

+0

Persisch denke ich [TimeSpan'] (https://msdn.microsoft.com/en-us/library/system.timespan (v = vs.110) .aspx) ist am besten für die Zeit geeignet. Für die Rate hängt es davon ab, was Sie damit machen. –

Antwort

0

Als Faustregel gilt, dass Sie den Typ verwenden, der besser zu den Werten passt, die Sie verarbeiten. Dies bedeutet, dass Sie DateTime oder TimeSpan für Zeit verwenden sollten, es sei denn, Sie interessieren sich nur für eine bestimmte Einheit, wie Sekunden, Tage, usw., in diesem Fall können Sie einen beliebigen Integer-Typ verwenden. Gewöhnlich benötigen Sie für die Zeit Präzision und wollen keine Rundungsfehler, also würde ich keinen Fließkomma-Typ wie float oder double verwenden.

Für alles, was mit Geld zu tun hat, wollen Sie natürlich auch keinen Rundungsfehler, also sollten Sie wirklich decimal hier verwenden.

schließlich nur, wenn für einige sehr spezifische Anforderungen, die Sie benötigen absolute Geschwindigkeit in einer Berechnung, die getan millionenfach und für die decimal geschieht nicht zu schnell genug ist, nur dann würde ich denken mit ein anderer schnellerer Typ. Ich würde zuerst versuchen, mit ganzzahligen Werten (vielleicht multipliziert Ihr Wert mit einer Potenz von 10, wenn Sie Dezimalzahlen haben) und am Ende nur durch diese Potenz von 10 dividieren. Wenn dies nicht möglich ist, nur dann würde ich an die Verwendung eines double denken. Tun Sie keine vorzeitige Optimierung, wenn Sie nicht sicher sind, dass es benötigt wird.

+0

Verwenden von "double" ist keine vorzeitige Optimierung, es ist die einfachere Wahl. Der Hauptpunkt der Vermeidung einer vorzeitigen Optimierung besteht darin, den Code nicht zu verkomplizieren, bevor Sie überhaupt wissen, ob sich das lohnt. Der Versuch, "Dezimal" oder einen ganzzahligen Typ zu verwenden, den Sie überall skalieren müssen, ist eine unnötige Komplikation, die vermieden werden sollte. – Kyle

+0

Ich denke, 'dezimal' ist einfacher und gibt weniger Kopfschmerzen. Wie ich oben erwähnt habe, erzeugt bei Gleitkommawerten manchmal der Mangel an Genauigkeit Ausgaben wie 0,8000001 oder 0,9999999 oder macht Dinge wie 0,1f == 0,1 falsch. Also musst du mit diesen Typen vorsichtiger sein. Wie auch immer, wir wissen fast nichts darüber, was Haosmark braucht, also raten wir hier. – Andrew

+0

Ich denke, dass in beiden Fällen die gleiche Vorsicht geboten ist, da "dezimal" immer noch ein Fließkommatyp ist und immer noch Rundungs- und Abschneidefehlern unterliegt. Es läuft auf die gleiche Art von Problemen, aber in verschiedenen Situationen. Ich stimme also nicht zu, dass es einfacher ist. Ich denke, dieser Ratschlag macht "Dezimal" wie eine magische Kugel erscheinen, wenn es nicht ist. – Kyle

1

Verwenden Sie double für beide. decimal ist für Währung oder andere Situationen, in denen die Basis-10-Darstellung der Nummer wichtig ist. Wenn Sie die Basis-10-Darstellung einer Zahl nicht interessieren, verwenden Sie nicht decimal. Für Dinge wie Zeit oder Änderungsraten von physikalischen Größen spielt die Basis-10-Darstellung im Allgemeinen keine Rolle, so dass decimal nicht die geeignetste Wahl ist.

Wichtig ist, dass decimal immer noch ein Fließkommatyp ist. Es leidet immer noch unter Rundungsfehler und kann bestimmte "einfache" Zahlen (wie 1/3) nicht darstellen. Der eine Vorteil (und ein Zweck) ist, dass es Dezimalzahlen mit weniger als 29 signifikanten Stellen genau darstellen kann. Das bedeutet Zahlen wie 0,1 oder 12345,6789. Grundsätzlich kann jede Dezimalzahl auf Papier mit weniger als 29 Ziffern geschrieben werden. Wenn Sie eine sich wiederholende Dezimalzahl oder eine irrationale Zahl haben, bietet decimal keine wesentlichen Vorteile.