2016-08-23 6 views
7

Welchen Datentyp kann ich zum Parsen von Java BigDecimal verwenden? In Objective - C kann mit NSDecimalNumber gearbeitet werden. Habe ich Swift-native Lösung (ohne NSDecimalNumber zu verwenden)?Java BigDecimal in Swift

+3

Verwenden Sie einfach 'NSDecimalNumber'. Es funktioniert gut von Swift. – Rob

+0

Sie verstehen nicht. Ich möchte native für Swift-Lösung (natürlich, wenn vorhanden). – SerjOxo

+0

Ich verstehe es. Eine "native" Lösung existiert nicht. Aber 'NSDecimalNumber' funktioniert gut. Und wenn Sie möchten, können Sie Operatoren definieren, die dafür sorgen, dass sie sich mehr wie eine native Lösung verhält, sodass Operatoren wie '+', '-' usw. so funktionieren, wie Sie es erwarten. – Rob

Antwort

7

Dies ist möglicherweise nicht das, was Sie wollen, wie Sie sagen schnelle native Lösung. Aber in Swift 3, eine alte C-Struktur basiert NSDecimal wird als Decimal importiert, und eine große Umordnung dafür wurde getan, um zu sagen, "es ist fast Swift-native".

let deca = 1.23 as Decimal //<- This actually may produce some conversion error, while `ExpressibleByFloatLiteral` uses `Double` as an intermediate value. 
let decb = 0.01 as Decimal 
print(deca + decb == 1.24) //->true 

UPDATE Added ein einfaches Beispiel, wo Sie einen Berechnungsfehler in Doppel (binär Floating-Point-System) finden können. (Getestet in Xcode 8 beta 6.)

let dblc = 0.000001 
let dbld = 100 as Double 
let dble = 0.0001 
print(dblc * dbld == dble) //->false (as Double cannot represent decimal fractions precisely) 

let decc = Decimal(string: "0.000001")! //<- avoiding conversion error 
let decd = 100 as Decimal //<- integer literal may not generate conversion error 
let dece = Decimal(string: "0.0001")! 
print(decc * decd == dece) //->true