在 Swift 中将浮点数转换为整数

227

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

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

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

'Float' 无法转换为 'Int'

有什么好的方法可以正确地从Float转换为Int吗?


2
as 运算符用于向下转型为子类。例如:UIView as UIButton - Jack
2
在Swift中,您可以使用as关键字或可选的as(as?)进行类型转换,例如4 as?String。如果4可以是字符串,则它将起作用,但如果不是,则不起作用。我提出这个问题是因为您在问题中使用了“casting”一词,我不想让您感到困惑。 :3 - A'sa Dickens
1
你的代码没有意义。 (float as Float) 没有任何作用,因为 float 已经是 Float 类型了。你可能想要的是 var integer: Int = float(同样的错误),或者 var integer: Int = float as Int。 - gnasher729
15个回答

349

在Swift中,您可以通过以下方式将Float转换为Int

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

您也可以通过@paulm的评论来实现此结果:

var myIntValue = Int(myFloatValue)

@paulm - 我还没有尝试过*(上面评论中的代码)。但可能对我们有用(不确定)*。 - iPatel
4
Swift编译器可以根据变量的赋值情况自动推断变量类型,所以不需要显式地声明变量类型。var myIntValue = Int(myFloatValue)是可行的。 - Tim Sullivan
(Swift 2.0)最好检查浮点值是否为有限值,如果myFloatvalue.isFinite {...} - ZYiOS
这段代码在处理像Int(Float.greatestFiniteMagnitude)这样的大数值时会崩溃。 - de.

135

显式类型转换

将数据转换为整数会失去任何精度(实际上是向下舍入)。通过访问数学库,您可以执行显式类型转换。例如:

如果您想要对其向下舍入并转换为整数:

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。

在后一种情况下,这可能看起来有些学究气,但从语义上讲更清晰,因为没有隐式转换...例如,如果您正在进行信号处理,则这一点非常重要。


6
值得注意的是,函数Int()只是简单地去掉小数部分,这通常不是期望的行为。使用Int(round(f))可以完成相应操作。 - Grzegorz D.
1
或者使用 ceil() 函数将值向上舍入。 - Vincent
1
边缘情况:round(10.5) == 11.0 - itMaxence
let y = Int(round(f)) can also be written as let y = lround(f) - S1LENT WARRIOR

34

有很多方法可以精确地舍入数字。您最终应该使用Swift标准库方法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

请注意以下示例:

let f: Float = 2.5
let i = Int(roundf(f)) // 3
let j = Int(f.rounded(.toNearestOrEven)) // 2

这应该是最好的答案,因为它提高了四舍五入及其相关API的意识,使开发人员能够更多地掌控和负责。FloatingPointRoundingRule - Juguang

29
转换过程很简单:
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
        }
    }
}

我希望这能对某些人有所帮助


7

通过将浮点数传递到整数初始化方法中,您可以获得浮点数的整数表示。

例:

Int(myFloat)

请注意,小数点后面的数字将被丢弃。也就是说,3.9被转换为整数3,8.99999被转换为整数8。


8
使用Int(MyFloat + .5)进行四舍五入。 - Jean Le Moignan

6

像这样:

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

4
使用函数式转换(在“整数和浮点数转换”一节中找到,来源于《Swift编程语言》[iTunes链接])
  1> Int(3.4)
$R1: Int = 3

1
var floatValue = 10.23
var intValue = Int(floatValue)

这已足够将 float 转换为 Int

1
假设您将浮点值存储在"X"中,并且将整数值存储在"Y"中。
Var Y = Int(x);

or

var myIntValue = Int(myFloatValue)

1

只需使用类型转换

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

 println("IntegerValue = \(integerValue)")

它将显示舍入值,例如:IntegerValue = 5表示小数点将被丢失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接