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没有构造函数和成员函数可以转换Decimal
为Int
.
如何在Swift 3中将Decimal转换为Int?
tec*_*242 28
这是我的最新答案(感谢Martin R和OP的评论).OP的问题只是pow(x: Decimal,y: Int) -> Decimal
在从结果中减去1之后将函数转换为Int.我已经在NSDecimal和Apple关于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)
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)
如果你有一个很长的小数,那么要注意舍入错误
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)
发布的任何一个答案都没有错,但我想提供一个扩展,以减少您需要经常使用它的场景的冗长。
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)
归档时间: |
|
查看次数: |
16080 次 |
最近记录: |