Ich schreibe Finanzanwendungen, bei denen ich ständig vor der Entscheidung stehe, ob ich ein Double oder eine Dezimalzahl verwenden soll.
Ich rechne immer mit Zahlen, die nicht mehr als 5 Dezimalstellen haben und nicht größer als ~100.000 sind. Ich habe das Gefühl, dass alle diese Zahlen ohne Rundungsfehler als Potenzen dargestellt werden können, aber ich war mir nie sicher.
Ich würde die Umstellung von Dezimalzahlen auf Paschalzahlen wegen des offensichtlichen Geschwindigkeitsvorteils vornehmen, aber letztendlich verwende ich immer noch die ToString-Methode, um die Preise an die Börsen zu übermitteln, und muss sicherstellen, dass sie immer die erwartete Zahl ausgibt. (89,99 statt 89,99000000001)
Fragen:
- Ist der Geschwindigkeitsvorteil wirklich so groß, wie naive Tests vermuten lassen? (~100 mal)
- Gibt es eine Möglichkeit, die Ausgabe von ToString zu garantieren, was ich will? Ist dies durch die Tatsache gewährleistet, dass meine Zahl immer darstellbar ist?
UPDATE: Ich habe ~ 10 Milliarden Preisaktualisierungen zu verarbeiten, bevor meine App laufen kann, und ich habe mit dezimalen jetzt für die offensichtliche Schutzgründe implementiert, aber es dauert ~ 3 Stunden, nur um einzuschalten, würde das Doppelte meine Einschaltzeit dramatisch reduzieren. Gibt es einen sicheren Weg, um es mit Verdoppelungen zu tun?
1 Stimmen
Was ist Ihr Engpass? Wo genau verbrauchen Sie alle Ihre CPU-Zyklen? Ohne solide Messungen ist die Wahrscheinlichkeit groß, dass Sie sich mit der völlig falschen Sache beschäftigen.
4 Stimmen
Da dezimale Nenner Potenzen von 10 und binäre Nenner Potenzen von 2 sind, kann nicht einmal 1 Dezimalstelle fehlerfrei dargestellt werden. Zum Beispiel hat 0,1 (ein Zehntel) keine exakte Entsprechung im Binärsystem, was dem gleichen Prinzip entspricht, dass es für ein Drittel keine exakte Darstellung im Dezimalsystem gibt.