Erhalten Sie den Exponenten von NSDecimalNumber in Objective-C?

8

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?

    
Rich Apodaca 28.09.2012, 15:52
quelle

5 Antworten

3
___ answer12643588 ___

Sie können auf -doubleValue :

zugreifen %Vor%     
___ answer12643532 ___

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.

    
___ qstntxt ___

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?

    
___ antwort12643558 ___

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.

    
___ answer26977123 ___

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%     
___
Jason Coco 28.09.2012 16:08
quelle
2

Sie können auf NSDecimal :

zugreifen %Vor%     
leo 28.09.2012 16:10
quelle
1

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 -decimalValue - 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.

    
Tim 28.09.2012 16:07
quelle
0

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%     
Lukas Kalinski 17.11.2014 16:23
quelle
-1

Sie können die Anzahl mit NSDecimalNumber Instanzen vergleichen, die mit Mantisse gleich 1 erstellt wurden, indem Sie den Exponenten ändern. Es kann wie eine binäre Suche funktionieren.

    
Sulthan 29.09.2012 12:02
quelle

Tags und Links