ChatGPT解决这个技术问题 Extra ChatGPT

在 Swift 中将 Float 转换为 Int

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

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

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

'Float' 不能转换为 'Int'

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

as 运算符用于向下转换为子类。即:UIView as UIButton
在 swift 中,您可以使用 as 关键字或可选的 as (as?) 进行类型转换,例如 4 as?字符串,如果 4 可以是字符串,它将起作用,但如果不是,它将不起作用。我提出这个是因为你在你的问题中使用了“铸造”这个词,我不想让你感到困惑。 :3
你的代码没有意义。 (float as Float) 什么都不做,因为 float 已经是 Float 类型了。您的意思是 var integer: Int = float (相同的错误)或 var integer: Int = float as Int。

J
Jamal

您可以像这样在 Swift 中将 Float 转换为 Int

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

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

var myIntValue = Int(myFloatValue)

@paulm - 我没有尝试过(上面的代码在评论中)。但可能对我们有用(不确定)。
转换足以让 Swift 编译器直观地识别变量类型,因此您不需要显式声明类型。 var myIntValue = Int(myFloatValue) 有效。
(swift 2.0)最好检查浮点值是否为有限值,如果 myFloatvalue.isFinite {...}
对于像 Int(Float.greatestFiniteMagnitude) 这样的大值,此代码将崩溃。
C
Community

显式转换

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

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


是的,值得注意的是 Int() 只是简单地削减了小数部分,这通常不是所需的行为;) Int(round(f)) 完成了这项工作。
或 ceil () 向上舍入该值。
边缘情况:round(10.5) == 11.0
let y = Int(round(f)) 也可以写成 let y = lround(f)
C
Community

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

这应该是最好的答案,因为它提高了对四舍五入及其相关API的认识,让开发者可以承担更多的控制和责任。 FloatingPointRoundingRule
A
Artyom Razinov

转换很简单:

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

我希望这可以帮助某人


A
A'sa Dickens

您可以通过将浮点数传递给 Integer 初始化方法来获得浮点数的整数表示。

例子:

Int(myFloat)

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


并使用 Int(MyFloat + .5) 进行舍入。
L
Logan

像这样:

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

c
cobbal

使用函数样式转换(在“The Swift Programming Language.”[iTunes 链接] 中标有“整数和浮点转换”的部分中找到)

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

K
Kumar KL

您可以像这样键入 cast:

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

p
pravin salame

只需使用类型转换

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

 println("IntegerValue = \(integerValue)")

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


N
Nikolay Kostov
var i = 1 as Int

var cgf = CGFLoat(i)

M
Mihriban Minaz
var floatValue = 10.23
var intValue = Int(floatValue)

这足以从 float 转换为 Int


B
Blisskarthik

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

Var Y = Int(x);

或者

var myIntValue = Int(myFloatValue)

d
de.

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

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


A
Aspen

使用 Int64 而不是 IntInt64 可以存储较大的 int 值。


您的意思是,对于原始问题,还是对于 Float 的值范围大于 Int 的问题?