2009-08-25 9 views
1

Ich frage mich, was ist der Sinn von NSDecimalNumber. Es bietet einige arithmetische Methoden, aber warum sollte ich NSDecimalNumber verwenden und nicht nur double oder NSNumber? Hat Apple dort Gleitkomma-Arithmetik-Hässlichkeit behandelt? Würde es das Leben leichter machen, wenn man hohe Präzision und große Fließkomma-Berechnungen verwendet?Ist es eine gute Idee, NSDecimalNumber für Fließkomma-Arithmetik anstatt einfach doppelt zu verwenden?

+0

Diese Frage ist in der Nähe Ihres dabei: http://stackoverflow.com/questions/421463/should-i-use -nsdecimalnumber-to-Deal-with-money –

Antwort

1

Dies hängt alles oder Ihre Bedürfnisse. Es ist ein Kompromiss zwischen Genauigkeit, Geschwindigkeit und Größe der Daten.

Wenn Sie eine Buchhaltungsanwendung schreiben, können Sie keine Genauigkeit verlieren und daher die NSDecimal-Nummer verwenden.

Ig du machst komplexe numerische Analyse die Geschwindigkeit könnte wichtig sein und so NSDecimalNumber wäre zu langsam. Aber selbst in diesem Fall würde Ihre Analyse auf die Präzision und Fehler schauen, die Sie sich leisten könnten, und hier könnte es Fälle geben, in denen Sie mehr Präzision benötigen, die Sie verdoppelt.

NSNumber ist ein separater Fall, es ist ein Klassencluster zum Speichern von C-Typ-Nummern in anderen Objekten und andere Verwendung in Cocoa.

1

NSDecimalNumber ist eine feste (und skalierbare) Ganzzahl, die auf eine bestimmte Größe skaliert wird, um Bruchzahlen darzustellen. Dies ist ein wenig anders als eine Gleitkommazahl (wo der Punkt offensichtlich schwebt ...)

Als Beispiel, sagen Sie, dass Sie Geld von 0,00 bis 999,99 darstellen müssen, könnten Sie dies in einer Ganzzahl von 0 speichern zu 99999 als eine Menge in Pennies. Die Skalierung (in Ziffern) ist 2 und die Genauigkeit ist 5. In einer Gleitkommazahl mit Genauigkeit 5 und einem Fließkomma können Sie beispielsweise von .00001 bis 99999 darstellen, aber nicht für 999.999.

1

Wenn Ihre Software mit Geld oder anderen nicht ganzzahligen Zahlen von Interesse für Wirtschaftsprüfer arbeitet, sind Sie gut beraten, dafür Dezimalzahlen zu verwenden (anstelle der binären, für die die zugrunde liegende HW optimiert ist); Aus diesem Grund werden alle Arten von Mehrzwecksprachen und -datenbanken nach hinten gebogen, um nicht-ganzzahlige Dezimalzahlen zu unterstützen, nicht nur binäre. Das Runden von Problemen mit binären Nicht-Ganzzahlen könnte leicht zu Bruchteilen eines Cent-Diskrepanzes führen, was am Limit sogar zu rechtlichen Problemen führen könnte, und realistischerweise von Buchhaltern und anderen Beteiligten wahrgenommen werden ! mit Geld & c als Fehler in Ihrem Programm, egal, wie standhaft kann man argumentieren, sonst -)

+0

ein "binary non-integer" wäre ein Doppel, zum Beispiel? –

+0

IRTFM: Floats und Doubles (doubles sind nur breitere Floats) sind beide binäre Nicht-Integer-Typen. Manchmal werden Ganzzahlen wie binäre Nicht-Ganzzahlen verwendet, wenn nur eine bestimmte Menge an Genauigkeit benötigt wird (Beispiel: Verwenden einer 64-Bit-Ganzzahl zur Darstellung von Zehntel Cent) – rpetrich

+0

Yep-, Float- oder Festkommazahlen beliebiger Breite. Sogar ein einfacher Wert von 0,1 kann nicht exakt im binären Gleitkomma- oder Fixpunkt irgendeiner endlichen Breite dargestellt werden. "Arbeit mit ganzen Zahlen von Cents" und dergleichen lässt Sie immer noch in einem Pickle wrt zusammengesetzte Zinsen, Hypothekenpläne usw. –

Verwandte Themen