为啥减去 NSDecimalNumbers 不起作用 - Swift 3

Posted

技术标签:

【中文标题】为啥减去 NSDecimalNumbers 不起作用 - Swift 3【英文标题】:Why subtracting NSDecimalNumbers do not work - Swift 3为什么减去 NSDecimalNumbers 不起作用 - Swift 3 【发布时间】:2017-09-07 12:22:55 【问题描述】:

使用subtracting() 方法从650.50 中减去5.0 时为什么会得到0

在下面的代码中,加法、乘法和除法工作正常,但为什么减法不行?我做错了什么?

查看 IBM 沙箱中的代码: http://swift.sandbox.bluemix.net/#/repl/59b1387696a0602d6cb19201

import Foundation

let num1:NSDecimalNumber = 650.50
let num2:NSDecimalNumber = 5.0 

let result = num1.adding(num2)
let result2 = num1.subtracting(num2)
let result3 = num1.multiplying(by: num2)
let result4 = num1.dividing(by: num2)

print("Addition: \(result)") // Addition: 655.5
// Why am I getting 0 here and not 645.5?
print("Subtraction: \(result2)") //Subtraction: 0
print("Multiplication: \(result3)") //Multiplication: 3252.5
print("Division: \(result4)") //Division: 130.1

苹果文档: https://developer.apple.com/documentation/foundation/nsdecimalnumber

【问题讨论】:

我在 XCode Swift Playground 中获得了“645.5”。可能是 IBM 部分的问题(比如说不是 ios/macOS Swift 部分)。 嗯,这很奇怪。感谢您的检查(我现在不在电脑旁)。 试试result2.doubleValue result2.doubleValue 有效,但根据文档,它应该返回一个 NSDecimalNumber 而您不必这样做。谢谢。 【参考方案1】:

这可能是因为与 NSDecimalNumber 相关的 IBM 沙箱的特殊性(事实上,Foundation 的许多部分在 Linux 上仍然不完全可用)。

无论如何,无论错误是什么,解决方案是使用 NSDecimalNumber 的 Swift 对应项,即 Decimal.

尽管这应该只是 NSDecimalNumber 的包装器,但它给出了正确的结果,即使在 IBM 平台上也是如此。

请注意,此包装器不使用 NSDecimalNumber 方法,它使用 Swift 运算符,例如 +*

import Foundation

let num1: Decimal = 650.50
let num2: Decimal = 5.0

let result = num1 + num2
let result2 = num1 - num2
let result3 = num1 * num2
let result4 = num1 / num2

print("Addition: \(result)")
print("Subtraction: \(result2)")
print("Multiplication: \(result3)")
print("Division: \(result4)")

给予:

加法:655.5 减法:645.5 乘法:3252.5 师:130.1

【讨论】:

快速提问,Decimal 是否与NSDecimalNumber 相同?也就是说Decimal是推荐币种吗?非常感谢! Decimal 应该与NSDecimalNumber 的类型相同,但转换为 Swift。它真正用于货币计算(十进制,高精度算术)。不过相比NSDecimalNumber,还是少了一些方法。 @fs_tigre 文档指出两者是桥接的,所以我会说是的,Decimal 应该具有相同的行为。 酷,Decimal 可能是我的最佳选择,因为您可以使用原生 Swift 运算符(+、- 等)。我将研究使用Decimal 会丢失哪些方法。非常感谢。 我相信Decimal实际上对应于NSDecimal。 NSDecimalNumber 是 NSDecimal 的封装。无论哪种情况,它都是处理货币的首选方式。有关更多信息,请参阅此答案。 ***.com/a/41264395/3203487【参考方案2】:

您的代码没有错误,并且在 Xcode/macOS 中可以正常工作。不过IBM的Swift沙箱用的是Linux,Foundation在Linux上的实现有issues。在 repo 的 Status 页面中,NSDecimalNumber 被标记为“未实现”。因此,它可能存在一些问题。请改用标准库中的类。

【讨论】:

以上是关于为啥减去 NSDecimalNumbers 不起作用 - Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

NSDecimalNumber 的数学完整性

为啥外部链接在构建后在 phonegap 应用程序上不起作用

为啥 pull-right 类在 bootstrap 版本 4.1.0 上不起作用? [复制]

为啥 ngfor 指令不起作用,尽管我在 Typescript 类中创建了正确的对象

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

将 NSDecimalNumbers 转换为负数