在Swift中将Float转换为Int


198

我想将转换FloatInt斯威夫特。像这样的基本转换不起作用,因为这些类型不是基元,这与Objective-C中的floats和ints 不同

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

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

“浮点数”不可转换为“整数”

知道如何将属性从转换FloatInt吗?


2
as操作是向下铸造到子类。即:UIView as UIButton
杰克

2
快速地,您可以使用as关键字或可选的as(as?)(例如4 as?)来进行类型转换。字符串,如果4可以是字符串,它将起作用,但如果不是,它将不起作用。我提出这个问题是因为您在问题中使用了“铸造”一词,但我不想让您感到困惑。:3
阿萨·狄更斯

您的代码没有意义。(float as Float)不执行任何操作,因为float已经是Float类型的。您的意思是var整数:Int =浮点数(相同的错误)或var整数:Int =浮点数与Int一样。
gnasher729

Answers:


317

您可以转换FloatInt斯威夫特这样的:

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

您还可以使用@paulm的注释来实现此结果:

var myIntValue = Int(myFloatValue)

@paulm-我没有尝试过(在注释中的代码上方)。但是可能对我们有用(不确定)
iPatel 2014年

4
强制转换足以让Swift编译器了解变量类型,因此您无需显式声明该类型。var myIntValue = Int(myFloatValue)作品。
蒂姆·沙利文

(swift 2.0)最好检查一下float值是否为有限值,如果myFloatvalue.isFinite {...}
ZYiOS

116

显式转换

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

在后一种情况下,这看起来似乎很古怪,但是在语义上更加清晰,因为没有隐式转换……例如,如果您要进行信号处理,则很重要。


3
是的,确实值得注意的是Int()只是削减了小数部分,这通常不是所需的行为;)Int(round(f))可以完成工作。
Grzegorz D.

1
或ceil()将值向上舍入。
文森特

边缘案例:round(10.5) == 11.0
itMaxence

26

转换很简单:

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

我希望这可以帮助某人


26

有很多方法可以精确地四舍五入。您最终应该使用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

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

您可以通过将float传递给Integer初始值设定项方法来获得float的整数表示。

例:

Int(myFloat)

请记住,小数点后的任何数字都会丢失。意思是,3.9是3的整数,而8.99999是8的整数。


7
并使用Int(MyFloat + .5)进行四舍五入。
Jean Le Moignan 2014年

4

使用函数样式转换(在“ Swift编程语言 ”中 “整数和浮点转换”部分中找到 [[iTunes链接])

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


1

只需使用类型转换

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

 println("IntegerValue = \(integerValue)")

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



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

这足以将转换floatInt


0

假设您将float值存储在中"X",并将整数值存储在中"Y"

Var Y = Int(x);

要么

var myIntValue = Int(myFloatValue)

-1

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


您的意思是,对于原始问题,还是对于Float值范围大于Int?的问题
台钳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.