在Swift中将Float转换为Int

时间:2014-06-04 05:46:52

标签: swift casting type-conversion

我想在Swift中将Float转换为Int。像这样的基本强制转换不起作用,因为这些类型不是原语,与Objective-C中的floatint不同

var float: Float = 2.2
var integer: Int = float as Float

但是这会产生以下错误消息:

  

'Float'不能转换为'Int'

知道如何将属性从Float转换为Int吗?

14 个答案:

答案 0 :(得分:303)

您可以在Swift中将Float转换为Int,如下所示:

var myIntValue:Int = Int(myFloatValue)
println "My value is \(myIntValue)"

你也可以用@ paulm的评论来实现这个结果:

var myIntValue = Int(myFloatValue)

答案 1 :(得分:102)

显式转换

转换为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。

在后一种情况下,这可能看起来很迂腐,但它在语义上更清晰,因为没有隐式转换......例如,如果你正在进行信号处理,这很重要。

答案 2 :(得分:25)

转换很简单:

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
        }
    }
}

我希望这可以帮助某人

答案 3 :(得分:22)

有很多方法可以精确地舍入数字。您最终应该使用swift的标准库方法Shared来舍入所需精度的浮点数。

要围绕向上使用rounded()规则:

.up

要围绕向下,请使用let f: Float = 2.2 let i = Int(f.rounded(.up)) // 3 规则:

.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

答案 4 :(得分:5)

像这样:

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

答案 5 :(得分:5)

通过将float传递给Integer初始化方法,可以得到float的整数表示。

示例:

Int(myFloat)

请记住,小数点后的任何数字都将丢失。含义,3.9是3的Int,而8.99999是8的整数。

答案 6 :(得分:3)

使用功能样式转换(位于“The Swift Programming Language.”[iTunes链接]中标记为“整数和浮点转换”的部分)

  1> Int(3.4)
$R1: Int = 3

答案 7 :(得分:1)

您可以像这样输入:

 var float:Float = 2.2
 var integer:Int = Int(float)

答案 8 :(得分:1)

只需使用类型转换

 var floatValue:Float = 5.4
 var integerValue:Int = Int(floatValue)

 println("IntegerValue = \(integerValue)")

它将显示舍入值:整数值= 5表示小数点将是损失

答案 9 :(得分:0)

var floatValue = 10.23
var intValue = Int(floatValue)

这足以从float转换为Int

答案 10 :(得分:0)

var i = 1 as Int

var cgf = CGFLoat(i)

答案 11 :(得分:0)

假设您将浮点值存储在"X"中,并且您将整数值存储在"Y"中。

Var Y = Int(x);

var myIntValue = Int(myFloatValue)

答案 12 :(得分:0)

此处介绍的大多数解决方案都会因大值而崩溃,因此不应在生产代码中使用。

如果您不关心非常大的值,请使用此代码将 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()

答案 13 :(得分:-1)

使用Int64代替IntInt64可以存储大的int值。