Java Swift 中的 BigDecimal

Java BigDecimal in Swift

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

这可能不是您想要的,正如您所说的swift-原生解决方案。 但是在 Swift 3 中,基于 NSDecimal 的旧 C 结构被导入为 Decimal,并且已经对其进行了大的重新安排,例如 "it is nearly 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 添加了一个简单的示例,您可以在其中找到 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

您还可以使用 j2obj,这是一个将 Java 代码转换为 Objective C 的 Google 项目,包括所有 Java 类型,例如 BigInteger 和 BigDecimal。使用它,我能够制作一个 XCFramework,它合并了对那些原生 Java 类型的支持,包括它们从 Java 到 Swift 的所有功能。很酷,虽然它不是一个小框架。

基本上您只需克隆 j2objc 并在本地构建(cd 到它的目录并“make dist -j8”)。然后创建一个带有框架目标的新 Xcode 项目。按照 Google 的 j2objc 站点上的步骤添加您的 J2OBJC_HOME 以构建设置并将库和 header 搜索路径添加到您的新框架项目。

现在,在您的框架 public header 中,您需要导入“java/math/BigDecimal.h”,并且您需要添加到框架的 header这是 BigDecimal.m 及其依赖项所需的所有 header 的副本。

最后将您的硬件平台框架存档并为模拟器构建,然后制作一个 XCFramework,包括所有那些来自存档和您的 DerivedData 的构建的 .frameworks。

一旦你有了 XCFramework,你就可以将它添加到它支持的架构的任何其他项目中。然后在代码中使用它。请注意,在创建它们的实例之前,您必须初始化 j2bjc 类。