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

18 浏览
0 Comments

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

我想在Swift中将一个Float转换为Int。基本的强制转换无法实现,因为这些类型不像Objective-C中的floatint那样是原始类型。\nvar float: Float = 2.2\nvar integer: Int = Int(float)\n\n但是这会产生以下错误信息:\n

\n\'Float\'无法转换为\'Int\'\n

\n有没有办法正确将Float转换为Int

0
0 Comments

在Swift中,有许多方法可以精确地四舍五入数字。你应该使用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

0
0 Comments

在Swift中将浮点数转换为整数的时候,会出现精度丢失的问题(实际上是向下取整)。但是通过访问数学库,可以进行显式转换。例如:

如果你想向下取整并将其转换为整数:

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)

问题的出现原因是在Swift中,直接使用Int()函数将浮点数转换为整数会造成精度丢失,需要通过访问数学库中的函数来进行显式转换。解决方法是使用floor()函数向下取整,ceil()函数向上取整,或者round()函数四舍五入到最近的整数。这些方法能够解决精度丢失的问题,确保转换结果是正确的整数值。在某些特殊情况下,可以使用lround()函数来取代Int(round(f))函数,达到相同的效果。

0
0 Comments

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

var myIntValue:Int = Int(myFloatValue)

println "My value is \(myIntValue)"

也可以通过以下方法实现相同的结果:

var myIntValue = Int(myFloatValue)

我还没有尝试过上面的代码(在评论中),但可能对我们有用(不确定)。

对于Swift编译器来说,强制转换已足够使其推断变量类型,因此不需要显式声明类型。var myIntValue = Int(myFloatValue)可以正常工作。

(Swift 2.0)最好检查浮点值是否为有限值,如果myFloatvalue.isFinite {...}

这段代码对于像Int(Float.greatestFiniteMagnitude)这样的大值会导致崩溃。

0