Sie können auf -doubleValue
:
zugreifen
%Vor%
Nein, es sieht nicht wie aus NSDecimalNumber hat ein Äquivalent. Ich denke, du musst vielleicht deine eigenen schreiben.
Wenn es Ihnen nichts ausmacht, ein wenig herumzuhacken (und Dokumentationswarnungen zu ignorieren), können Sie sich jedoch die NSDecimal-Struktur , die von frexp(3)
- es hat eine Anzahl von Felder, zu denen Sie wahrscheinlich gelangen könnten. Ob dies subjektiv besser oder schlechter als deine NSString-Manipulationen ist, liegt bei dir.
Wie kann ich den Exponenten (Skalierung) in NSDecimalNumber finden?
Obwohl es prinzipiell möglich sein sollte, dies zu tun, indem man zuerst in einen NSString konvertiert, gefolgt von einigen hässlichen Stringmanipulationen, würde ich es lieber vermeiden.
Mit einem Java BigDecimal kann ich die scale () Methode, um die Skalierung zu erhalten.
Gibt es eine ähnlich präzise Methode für NSDecimalNumber?
Wenn Sie den Exponenten aus irgendeinem Grund wirklich brauchen (anders als einfach anzeigen, den Sie mit einem Zahlenformatierer konfigurieren können), können Sie das primitive Double mit der Methode double
erhalten und dann -doubleValue
verwenden die Mantissen- und Exponentenwerte.
Das ganze Design hinter Objekten zum Ausführen und Speichern von Fließkomma-Berechnungen besteht darin, dass Sie Berechnungs- und Genauigkeitsfehler effektiver handhaben können. Die Einschränkung dieses Entwurfs besteht jedoch erst, wenn Sie von einem Skalar konvertieren (z. B. -longDoubleValue
oder Kombination von Mantisse und Exponent) erwartet, dass Sie innerhalb des Objektrahmens bleiben und nicht zurück in ein (potentiell) weniger präzises Format konvertieren.
Ich schlage vor, dass %code% die beste Option ist, da andere Antworten auf den Zugriff auf private Strukturdatensätze hindeuten, die sich ändern können, und deren Verwendung keinen Präzisionsverlust nahelegt, obwohl es tatsächlich sehr gut sein kann (wie in der Header-Dateien). Bei der Umwandlung in ein Double wissen Sie und diejenigen, die Ihren Code verwenden / lesen, genau, welche Präzisionsfehler möglich sind, weil der Typ sehr gut verstanden und sehr gut dokumentiert ist.
Wenn Sie schließlich sicher sein wollen, dass eine Conversion zu einem Fehler führt, können Sie ein NSDecimalNumberHandler mit Informationen darüber, welche Art von Rundungs- / Präzisionsfehlern Sie beim Konvertieren erwarten können der Doppel-Skalar-Typ.
Ich schlage auch vor, dass Sie eine Verbesserungsanfrage mit dem Apple-Bugreporter hinzufügen, die besagt, dass Sie direkt auf den Exponenten zugreifen und möglicherweise einen höheren Genauigkeitstyp hinzufügen möchten, wie zB eine %code% -Methode.
Bearbeiten enthält weitere Informationen
___ tag123objectivec ___ Dieses Tag sollte nur bei Fragen verwendet werden, die sich auf Objective-C-Funktionen beziehen oder von Code in der Sprache abhängen. Die Tags [Kakao] und [Kakao-Touch] sollten verwendet werden, um nach Frameworks oder Klassen von Apple zu fragen. Verwenden Sie die zugehörigen Tags [ios], [macos], [apple-watch] und [tvos] für Probleme, die für diese Plattformen spezifisch sind.
___ tag123ios ___ iOS ist das mobile Betriebssystem, das auf dem Apple iPhone, iPod touch und iPad ausgeführt wird. Verwenden Sie dieses Tag [ios] für Fragen zur Programmierung auf der iOS-Plattform. Verwenden Sie die verwandten Tags [objective-c] und [swift] für Probleme, die für diese Programmiersprachen spezifisch sind.
___ qstnhdr ___ Erhalten Sie den Exponenten von NSDecimalNumber in Objective-C?
___ answer12652553 ___
Sie können die Anzahl mit %code% Instanzen vergleichen, die mit Mantisse gleich 1 erstellt wurden, indem Sie den Exponenten ändern. Es kann wie eine binäre Suche funktionieren.
Wenn Sie möchten, dass der Ausdruck auf base-10-Form steht (frexp (3) scheint nur base-2 zu verwenden), könnten Sie Folgendes versuchen:
%Vor%