Swift 3:十进制转整数

Swift 3 : Decimal to Int

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

Int(pow(Decimal(size), 2) - 1) 

但我得到:

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

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

这是我更新的答案(感谢 Martin R 和 OP 的评论)。 OP 的问题只是在从结果中减去 1 后将 pow(x: Decimal,y: Int) -> Decimal 函数转换为 Int 。我已经在这个 SO post for NSDecimal and Apple's documentation on Decimal 的帮助下回答了这个问题。您必须将结果转换为 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
let decimalToInt = (yourDecimal as NSDecimalNumber).intValue

或@MartinR 建议:

let decimalToInt = NSDecimalNumber(decimal: yourDecimal).intValue

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

extension Decimal {
    var int: Int {
        return NSDecimalNumber(decimal: self).intValue
    }
}

调用它:

let powerDecimal = pow(2, 2) // Output is Decimal
let powerInt = powerDecimal.int // Output is now an Int

只需使用Decimal的描述,String替换NSDecimalNumber来桥接它。

extension Decimal {
    var intVal: Int? {
        return Int(self.description)
    }
}

如果您的小数点很长,请注意舍入错误

let decimal = Decimal(floatLiteral: 100.123456)
let intValue = (decimal as NSDecimalNumber).intValue // This is 100

然而

let veryLargeDecimal = Decimal(floatLiteral: 100.123456789123)
let intValue = (veryLargeDecimal as NSDecimalNumber).intValue // This is -84 !

我确保在将 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

不幸的是,使用提供的某些方法时出现间歇性故障。

NSDecimalNumber(decimal: <num>).intValue 会产生意想不到的结果...

(lldb) po NSDecimalNumber(decimal: self)
10.6666666666666666666666666666666666666

(lldb) po NSDecimalNumber(decimal: self).intValue
0

我认为对此有更多的讨论, and @Martin was pointing it out here

我没有直接使用十进制值,而是在将十进制转换为整数之前先将小数转换为整数。

extension Decimal {

   func rounded(_ roundingMode: NSDecimalNumber.RoundingMode = .down, scale: Int = 0) -> Self {
        var result = Self()
        var number = self
        NSDecimalRound(&result, &number, scale, roundingMode)
        return result
    }
    
    var whole: Self { rounded( self < 0 ? .up : .down) }
    
    var fraction: Self { self - whole }
    
    var int: Int {
        NSDecimalNumber(decimal: whole).intValue
    }
}