Dezimal vs Doppelte Geschwindigkeit
Ich Schreibe Finanz-Anwendungen, wo ich ständig Kampf die Entscheidung zum Einsatz eines Doppel-vs mit einem Dezimalkomma.
Alle meine Mathe-arbeiten auf zahlen mit nicht mehr als 5 Nachkommastellen und sind nicht größer als ~100.000 Euro. Ich habe das Gefühl, dass alle diese dargestellt werden kann, wie doubles sowieso ohne Rundungsfehler, war aber nie sicher.
Ich würde voran gehen und den Schalter von Dezimalstellen, die verdoppelt für die offensichtliche speed-Vorteil, außer, dass am Ende des Tages, ich benutze immer noch die ToString-Methode zu übermitteln, die Preise auf Börsen, und müssen sicherstellen, dass Sie immer die Ausgänge der Zahl, die ich erwarte. (89.99 statt 89.99000000001)
Fragen:
- Ist der Geschwindigkeitsvorteil wirklich so groß wie naiv tests vorschlagen? (~100 mal)
- Gibt es eine Möglichkeit zu garantieren, die Ausgabe von ToString zu werden, was ich will? Ist dies gewährleistet durch die Tatsache, dass meine Nummer ist immer darstellbar?
UPDATE: ich habe zu verarbeiten ~ 10 Milliarden Preis-updates, bevor Sie die app ausführen können, und das habe ich umgesetzt mit dezimal-jetzt für die offensichtliche Schutz-Gründen, aber es dauert ~3 Stunden, nur um zu schalten, Doppel, dramatisch reduzieren meine wiederum auf Zeit. Gibt es einen sicheren Weg, es zu tun mit verdoppelt?
InformationsquelleAutor der Frage Superman | 2008-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort Robert Gamble
Gibt es zwei trennbare Probleme hier. Eine davon ist, ob die doppelten hat genug Präzision zu halten, werden alle bits, die Sie brauchen, und die andere ist, wo Sie es vertreten können Ihre zahlen genau.
Als für die genaue Darstellung, du hast Recht, vorsichtig zu sein, weil eine exakte Dezimalbruch wie 1/10 ist keine exakte binäre Gegenstück. Allerdings, wenn Sie wissen, dass Sie brauchen nur 5 Dezimalstellen, die Sie verwenden können skaliert Arithmetik in denen Sie tätig sind, auf die zahlen multipliziert mit 10^5. So zum Beispiel, wenn Sie repräsentieren wollen 23.7205 genau Sie vertreten Sie als 2372050.
Lassen Sie uns sehen, ob es genug Genauigkeit: double precision erhalten Sie 53 bits of precision.
Dies entspricht 15+ Dezimalziffern. Also dieses würde Ihnen erlauben, fünf stellen nach dem Dezimalpunkt und 10 stellen vor dem Dezimaltrennzeichen, das scheint ausreichend für Ihre Anwendung.
Ich würde diesen C-code in einem .h-Datei:
Gibt es wohl ein paar grobe Flecken, aber das sollte genug sein, zum du zu erhalten begannen.
Kein Mehraufwand für zusätzlich Kosten für eine Multiplikation oder Division verdoppelt.
Wenn Sie Zugang zu C99, können Sie auch versuchen, skalierte integer-Arithmetik unter Verwendung der
int64_t
64-bit-integer-Typ. Welche schneller ist, hängt von Ihrer hardware-Plattform.InformationsquelleAutor der Antwort Norman Ramsey
Immer verwenden Dezimalstellen für alle finanziellen Berechnungen oder werden Sie für immer verfolgen 1cent Rundungsfehler.
InformationsquelleAutor der Antwort Craig
So, müssen Sie entscheiden, ob Sie sich mit der Rundung vor dem Aufruf von ToString (), oder ob Sie brauchen, um zu finden, die einen anderen Mechanismus, der sich mit Rundung Ihrer Ergebnisse, wie Sie in einen string umgewandelt werden. Oder Sie können weiterhin verwenden, dezimal-Arithmetik, da es genau bleiben, und es wird schneller, sobald die Maschinen freigesetzt werden, unterstützen den neuen IEEE-754-dezimal-Arithmetik in hardware.
Obligatorischen Querverweis: Was Jeder Computer Scientist Should Know About Floating-Point Arithmetic. Das ist eine von vielen möglichen URLs und führt zu einer PDF-Datei. Es gibt eine HTML-version an Sonnedie offensichtlich eine bearbeitete version der gleichen Zeitung.
Informationen auf dezimal-Arithmetik und der neue IEEE-754:2008 standard in diesem Speleotrove Website (material zuvor gehostet bei IBM).
InformationsquelleAutor der Antwort Jonathan Leffler
Nur mit einem langen und multipliziert mit einer Potenz von 10. Nachdem Sie fertig sind, dividieren durch die gleiche Kraft der 10.
InformationsquelleAutor der Antwort
Dezimalzahlen sollte immer verwendet werden, für finanzielle Berechnungen. Die Größe der zahlen ist nicht wichtig.
Ist der einfachste Weg für mich zu erklären, ist über einige C# - code.
Dass bit-code ausdrucken False obwohl 3.1 ist gleich 3.1...
Gleiche Sache...aber mit dezimal:
Diese nun ausdrucken Wahr!
Wenn Sie wollen vermeiden, diese Art von Problem, empfehle ich Ihnen-stick mit Dezimalzahlen.
InformationsquelleAutor der Antwort mezoid
Verweise ich Sie auf meine Antwort auf die diese Frage.
Verwenden Sie eine lange, store der kleinste Betrag, den Sie brauchen, um zu verfolgen, und zeigen Sie die Werte entsprechend.
InformationsquelleAutor der Antwort gbjbaanb