2016-08-23 55 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