2016-08-23 34 views
7

Java BigDecimal ayrıştırma için hangi veri tipini kullanabilirim? Hedefte - C, NSDecimalNumber kullanılarak yapılabilir. Swift-native çözümüm var mı (NSDecimalNumber kullanmadan)?Java BigDecimal in Swift

+3

Sadece 'NSDecimalNumber' kullanımı (Xcode 8 beta 6'da test edilmiştir). Swift'den iyi çalışıyor. – Rob

+0

Anlamıyorsunuz. Swift çözümü için yerel istiyorum (tabii eğer varsa). – SerjOxo

+0

Anladım. "Yerel" bir çözüm mevcut değil. Ama 'NSDecimalNumber' iyi çalışıyor. Ve eğer isterseniz, operatörün + +, vb. Gibi operatörlerin beklediğiniz gibi çalışabilmesi için yerel bir çözüm gibi davranmasını sağlayan operatörleri tanımlayabilirsiniz. – Rob

cevap

7

swift-native özümü derken, bu sizin istediğiniz gibi olmayabilir. Ancak Swift 3'te, eski bir C-struct tabanlı NSDecimal, Decimal olarak içe aktarılır ve bunun için "neredeyse Swift-native'tir" şeklinde büyük bir yeniden düzenleme yapılmıştır.

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 

GÜNCELLEME Eklendi sen Çift bir hesaplama hatası (ikili kayan noktalı sistemi) bulabilirsiniz basit bir örnek.

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