我想在 Swift 中将 Float
转换为 Int
。像这样的基本转换不起作用,因为这些类型不是基元,不像 Objective-C 中的 float
和 int
var float: Float = 2.2
var integer: Int = float as Float
但这会产生以下错误消息:
'Float' 不能转换为 'Int'
知道如何将属性从 Float
转换为 Int
?
as
运算符用于向下转换为子类。即:UIView as UIButton
您可以像这样在 Swift 中将 Float
转换为 Int
:
var myIntValue:Int = Int(myFloatValue)
println "My value is \(myIntValue)"
您还可以使用@paulm 的评论来实现此结果:
var myIntValue = Int(myFloatValue)
显式转换
转换为 Int 将丢失任何精度(实际上是向下舍入)。通过访问数学库,您可以执行显式转换。例如:
如果您想向下取整并转换为整数:
let f = 10.51
let y = Int(floor(f))
结果是 10。
如果您想四舍五入并转换为整数:
let f = 10.51
let y = Int(ceil(f))
结果是 11。
如果要显式四舍五入到最接近的整数
let f = 10.51
let y = Int(round(f))
结果是 11。
在后一种情况下,这可能看起来很迂腐,但它在语义上更清晰,因为没有隐式转换......例如,如果你正在做信号处理,这很重要。
round(10.5) == 11.0
let y = Int(round(f))
也可以写成 let y = lround(f)
有很多方法可以精确地舍入数字。您最终应该使用 swift 的标准库方法 rounded()
以所需的精度舍入浮点数。
要四舍五入 up 使用 .up
规则:
let f: Float = 2.2
let i = Int(f.rounded(.up)) // 3
要四舍五入 down 使用 .down
规则:
let f: Float = 2.2
let i = Int(f.rounded(.down)) // 2
要四舍五入到 最近 整数,请使用 .toNearestOrEven
规则:
let f: Float = 2.2
let i = Int(f.rounded(.toNearestOrEven)) // 2
请注意以下示例:
let f: Float = 2.5
let i = Int(roundf(f)) // 3
let j = Int(f.rounded(.toNearestOrEven)) // 2
FloatingPointRoundingRule
转换很简单:
let float = Float(1.1) // 1.1
let int = Int(float) // 1
但这并不安全:
let float = Float(Int.max) + 1
let int = Int(float)
将由于一次不错的崩溃:
fatal error: floating point value can not be converted to Int because it is greater than Int.max
所以我创建了一个处理溢出的扩展:
extension Double {
// If you don't want your code crash on each overflow, use this function that operates on optionals
// E.g.: Int(Double(Int.max) + 1) will crash:
// fatal error: floating point value can not be converted to Int because it is greater than Int.max
func toInt() -> Int? {
if self > Double(Int.min) && self < Double(Int.max) {
return Int(self)
} else {
return nil
}
}
}
extension Float {
func toInt() -> Int? {
if self > Float(Int.min) && self < Float(Int.max) {
return Int(self)
} else {
return nil
}
}
}
我希望这可以帮助某人
您可以通过将浮点数传递给 Integer 初始化方法来获得浮点数的整数表示。
例子:
Int(myFloat)
请记住,小数点后的任何数字都将丢失。意思是,3.9 是 3 的 Int,而 8.99999 是 8 的整数。
像这样:
var float:Float = 2.2 // 2.2
var integer:Int = Int(float) // 2 .. will always round down. 3.9 will be 3
var anotherFloat: Float = Float(integer) // 2.0
您可以像这样键入 cast:
var float:Float = 2.2
var integer:Int = Int(float)
只需使用类型转换
var floatValue:Float = 5.4
var integerValue:Int = Int(floatValue)
println("IntegerValue = \(integerValue)")
它将显示舍入值,例如:IntegerValue = 5 表示小数点将丢失
var i = 1 as Int
var cgf = CGFLoat(i)
var floatValue = 10.23
var intValue = Int(floatValue)
这足以从 float
转换为 Int
假设您将浮点值存储在 "X"
中,并且将整数值存储在 "Y"
中。
Var Y = Int(x);
或者
var myIntValue = Int(myFloatValue)
此处介绍的大多数解决方案都会因大值而崩溃,不应在生产代码中使用。
如果您不关心非常大的值,请使用此代码将 Double
限制为最大/最小 Int
值。
let bigFloat = Float.greatestFiniteMagnitude
let smallFloat = -bigFloat
extension Float {
func toIntTruncated() -> Int {
let maxTruncated = min(self, Float(Int.max).nextDown)
let bothTruncated = max(maxTruncated, Float(Int.min))
return Int(bothTruncated)
}
}
// This crashes:
// let bigInt = Int(bigFloat)
// this works for values up to 9223371487098961920
let bigInt = bigFloat.toIntTruncated()
let smallInt = smallFloat.toIntTruncated()
使用 Int64
而不是 Int
。 Int64
可以存储较大的 int 值。
Float
的值范围大于 Int
的问题?
var myIntValue = Int(myFloatValue)
有效。Int(Float.greatestFiniteMagnitude)
这样的大值,此代码将崩溃。