Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的Java BigDecimal_Swift_Nsdecimalnumber - Fatal编程技术网

Swift中的Java BigDecimal

Swift中的Java BigDecimal,swift,nsdecimalnumber,Swift,Nsdecimalnumber,我可以使用什么数据类型来解析JavaBigDecimal?在Objective-C中,可以使用NSDecimalNumber来完成。我是否有Swift本机解决方案(不使用NSDecimalNumber)?这可能不是您想要的,正如您所说的Swift本机解决方案。 但在Swift 3中,一个基于旧C结构的NSDecimal作为Decimal导入,并对其进行了一次大的重新安排,说“它几乎是Swift原生的” 将deca=1.23设为十进制//true 更新添加了一个简单的示例,您可以在其中找到双精

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

这可能不是您想要的,正如您所说的Swift本机解决方案。 但在Swift 3中,一个基于旧C结构的
NSDecimal
作为
Decimal
导入,并对其进行了一次大的重新安排,说“它几乎是Swift原生的”

将deca=1.23设为十进制//true

更新添加了一个简单的示例,您可以在其中找到双精度(二进制浮点系统)中的计算错误。(在Xcode 8 beta 6中测试。)

设dblc=0.000001
设dbld=100为双精度
设dble=0.0001
print(dblc*dbld==dble)/->false(因为Double不能精确表示小数)

设decc=Decimal(字符串:“0.000001”)// 您还可以使用j2obj,这是一个将Java代码转换为Objective C的Google项目,包括所有Java类型,如BigInteger和BigDecimal。利用这一点,我能够创建一个XCFramework,将对这些原生Java类型的支持(包括它们从Java获得的所有功能)合并到Swift中。非常酷,尽管它不是一个小框架

基本上,您只需克隆j2objc并在本地构建(cd到其目录并“makedist-j8”)。然后用一个框架目标创建一个新的Xcode项目。按照Google的j2objc站点上的步骤添加j2objc_HOME to build设置,并将库和头搜索路径添加到新的框架项目中

现在,在框架的公共头文件中,您需要导入“java/math/BigDecimal.h”,并且需要向框架头文件中添加BigDecimal.m及其依赖项所需的所有头文件的副本

最后,为硬件平台归档您的框架并为模拟器构建,然后制作一个XCFramework,其中包括所有从归档和衍生数据中构建的.frameworks


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

只需使用
NSDecimalNumber
。斯威夫特很好用,你不明白。我想要本机的Swift解决方案(当然,如果存在的话)。我明白。“本机”解决方案不存在。但是
NSDecimalNumber
工作正常。如果您愿意,您可以定义一些运算符,使其行为更像本机解决方案,以便像
+
-
等运算符可以按您的预期工作。@请注意,也许您应该在问题中提到这一点。不过,Swift Decimal只能达到128位精度。@CommaToast,True,如果这可能是一个问题,您可能需要找到另一个解决方案。这个答案是在Objective-C中的假设下编写的,可以使用
NSDecimalNumber
来完成。
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
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