我想在Swift中转换浮点数为Int。像这样的基本强制转换不起作用,因为这些类型不是基本类型,不像Objective-C中的float和int类型
var float: Float = 2.2
var integer: Int = float as Float
但是这会产生以下错误消息:
Float不能转换为Int
知道如何将属性从Float转换为Int吗?
我想在Swift中转换浮点数为Int。像这样的基本强制转换不起作用,因为这些类型不是基本类型,不像Objective-C中的float和int类型
var float: Float = 2.2
var integer: Int = float as Float
但是这会产生以下错误消息:
Float不能转换为Int
知道如何将属性从Float转换为Int吗?
当前回答
使用函数样式的转换(参见“Swift编程语言”中的“整数和浮点转换”一节)。(iTunes链接))
1> Int(3.4)
$R1: Int = 3
其他回答
显式转换
转换为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。
在后一种情况下,这可能看起来很迂腐,但它在语义上更清楚,因为没有隐式转换……如果你在做信号处理,这很重要。
使用函数样式的转换(参见“Swift编程语言”中的“整数和浮点转换”一节)。(iTunes链接))
1> Int(3.4)
$R1: Int = 3
这里介绍的大多数解决方案对于较大的值都会崩溃,不应该在生产代码中使用。
如果你不关心非常大的值,使用这段代码来夹紧Double到max/min 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()
只使用类型转换
var floatValue:Float = 5.4
var integerValue:Int = Int(floatValue)
println("IntegerValue = \(integerValue)")
它将显示舍入值,例如:IntegerValue = 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