2016-08-23 57 views
7

我可以使用哪些數據類型來解析Java BigDecimal?在Objective-C中,可以使用NSDecimalNumber來完成。我有Swift原生解決方案嗎(不使用NSDecimalNumber)?Swift中的Java BigDecimal

+3

只需使用'NSDecimalNumber'。它從Swift工作正常。 – Rob

+0

你不明白。我想Swift解決方案的本地(當然,如果存在)。 – SerjOxo

+0

我明白。 「本機」解決方案不存在。但'NSDecimalNumber'工作正常。如果你願意,你可以定義運算符,使其更像本地解決方案,所以像'+','''等運算符按照你的預期工作。 – Rob

回答

7

這可能不是你想要的,正如你所說的swift原生解決方案。 但是在Swift 3中,一個基於C結構的舊的NSDecimal被導入爲Decimal,並且對它進行了大規模的重新安排,說「它幾乎是Swift本地」。

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添加了一個簡單的例子,在那裏你可以找到雙計算錯誤(二進制浮點系統)。 (在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