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
}
}
我尝试使用以下代码将 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
我认为对此有更多的讨论
我没有直接使用十进制值,而是在将十进制转换为整数之前先将小数转换为整数。
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
}
}