Swift中的Java BigDecimal

Srj*_*0x0 8 nsdecimalnumber swift

我可以用什么数据类型来解析Java BigDecimal?在Objective-C中,它可以通过使用来完成NSDecimalNumber.我有Swift原生解决方案(不使用NSDecimalNumber)吗?

OOP*_*Per 11

这可能不是你想要的,因为你说的是快速原生的解决方案.但是在Swift 3中,一个旧的C-struct NSDecimal被导入Decimal,并且已经完成了一个重大的重新安排,就像说"它几乎是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
Run Code Online (Sandbox Code Playgroud)

更新添加了一个简单的示例,您可以在Double(二进制浮点系统)中找到计算错误.(在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
Run Code Online (Sandbox Code Playgroud)