Swift 3:十进制到Int

Col*_*amp 25 nsdecimalnumber ios swift swift3

我尝试使用以下代码将Decimal转换为Int:

Int(pow(Decimal(size), 2) - 1) 
Run Code Online (Sandbox Code Playgroud)

但我得到:

.swift:254:43: Cannot invoke initializer for type 'Int' with an argument list of type '(Decimal)' 
Run Code Online (Sandbox Code Playgroud)

在这里我知道pow正在返回a Decimal但似乎Int没有构造函数和成员函数可以转换DecimalInt.
如何在Swift 3中将Decimal转换为Int?

tec*_*242 28

这是我的最新答案(感谢Martin R和OP的评论).OP的问题只是pow(x: Decimal,y: Int) -> Decimal在从结果中减去1之后将函数转换为Int.我已经在NSDecimalApple关于Decimal的文档的SO帖子的帮助下回答了这个问题.您必须将结果转换为NSDecimalNumber,然后可以将其转换为Int:

let size = Decimal(2)
let test = pow(size, 2) - 1
let result = NSDecimalNumber(decimal: test)
print(Int(result)) // testing the cast to Int
Run Code Online (Sandbox Code Playgroud)

  • 我只是想知道如何将Decimal转换为Int,不幸的是您误解了我的目标。 (2认同)
  • *是*a`pow(_ x:Decimal,_ y:Int) - > Decimal`函数. (2认同)

Jua*_*ero 11

let decimalToInt = (yourDecimal as NSDecimalNumber).intValue
Run Code Online (Sandbox Code Playgroud)

或者@MartinR建议:

let decimalToInt = NSDecimalNumber(decimal: yourDecimal).intValue
Run Code Online (Sandbox Code Playgroud)

  • 有时这可能会失败... ```(lldb) po NSDecimalNumber(decimal: self) 10.6666666666666666666666666666666666666 (lldb) po NSDecimalNumber(decimal: self).intValue 0```。我认为[这里]有更多的讨论(/sf/ask/3922564621/ o),我认为@Martin [此处]指出了这一点(https://bugs.swift.org/browse/SR-2980) (3认同)
  • 这个答案是危险的错误。这是一个示例: `(lldb) po (Decimal(1201.68) as NSDecimalNumber).intValue -642` (3认同)

ban*_*isa 9

如果你有一个很长的小数,那么要注意舍入错误

let decimal = Decimal(floatLiteral: 100.123456)
let intValue = (decimal as NSDecimalNumber).intValue // This is 100
Run Code Online (Sandbox Code Playgroud)

然而

let veryLargeDecimal = Decimal(floatLiteral: 100.123456789123)
let intValue = (veryLargeDecimal as NSDecimalNumber).intValue // This is -84 !
Run Code Online (Sandbox Code Playgroud)

我确保在将 Decimal 转换为 Int 之前将其四舍五入,使用NSDecimalRound(您可以将其放入 Decimal 的扩展中)。

var veryLargeDecimal = Decimal(floatLiteral: 100.123456789123)
var rounded = Decimal()
NSDecimalRound(&rounded, &veryLargeDecimal, 0, .down)
let intValue = (rounded as NSDecimalNumber).intValue // This is now 100
Run Code Online (Sandbox Code Playgroud)

  • 有些人超越了表面的解决方案并拯救了生命:D (3认同)

Cod*_*der 6

发布的任何一个答案都没有错,但我想提供一个扩展,以减少您需要经常使用它的场景的冗长。

extension Decimal {
    var int: Int {
        return NSDecimalNumber(decimal: self).intValue
    }
}
Run Code Online (Sandbox Code Playgroud)

调用它:

let powerDecimal = pow(2, 2) // Output is Decimal
let powerInt = powerDecimal.int // Output is now an Int
Run Code Online (Sandbox Code Playgroud)