如何在Swift中对CGFloat进行舍入?
我试过ceil(CDouble(myCGFloat))
,但这只适用于iPad Air& iPhone 5S。
在其他模拟设备上运行时,出现错误'NSNumber' is not a subtype of 'CGFloat'
答案 0 :(得分:105)
更新:Apple现在定义了一些CGFloat特定版本的常用函数,例如ceil
:
func ceil(x: CGFloat) -> CGFloat
...专门应对32/64位差异。如果您只是将ceil
与CGFloat参数一起使用,它现在应该适用于所有体系结构。
我原来的回答:
我认为这非常可怕,但任何人都可以想到更好的方法吗? #if
似乎不适用于CGFLOAT_IS_DOUBLE
;我认为您仅限于使用I can see in the documentation for conditional compilation。
var x = CGFloat(0.5)
#if arch(x86_64) || arch(arm64)
var test = ceil(x)
#else
var test = ceilf(x)
#endif
答案 1 :(得分:23)
使用Swift 4.2,根据您的需要,您可以选择以下3种方式之一来对CGFloat
进行舍入。
CGFloat
的{{1}}方法 rounded(_:)
协议为rounded(_:)
方法提供符合它的类型。 FloatingPoint
的{{1}}有以下声明:
CGFloat
使用指定的舍入规则将此值舍入为整数值。
下面的Playground示例代码显示了如何使用rounded(_:)
来整理func rounded(_ rule: FloatingPointRoundingRule) -> CGFloat
值:
rounded(_:)
CGFloat
函数 Darwin 提供import CoreGraphics
let value1: CGFloat = -0.4
let value2: CGFloat = -0.5
let value3: CGFloat = -1
let value4: CGFloat = 0.4
let value5: CGFloat = 0.5
let value6: CGFloat = 1
let roundedValue1 = value1.rounded(.up)
let roundedValue2 = value2.rounded(.up)
let roundedValue3 = value3.rounded(.up)
let roundedValue4 = value4.rounded(.up)
let roundedValue5 = value5.rounded(.up)
let roundedValue6 = value6.rounded(.up)
print(roundedValue1) // prints -0.0
print(roundedValue2) // prints -0.0
print(roundedValue3) // prints -1.0
print(roundedValue4) // prints 1.0
print(roundedValue5) // prints 1.0
print(roundedValue6) // prints 1.0
函数,该函数具有以下声明:
ceil(_:)
下面的Playground代码显示了如何使用ceil(_:)
来舍入func ceil<T>(_ x: T) -> T where T : FloatingPoint
值:
ceil(_:)
CGFloat
如果您要对import CoreGraphics
let value1: CGFloat = -0.4
let value2: CGFloat = -0.5
let value3: CGFloat = -1
let value4: CGFloat = 0.4
let value5: CGFloat = 0.5
let value6: CGFloat = 1
let roundedValue1 = ceil(value1)
let roundedValue2 = ceil(value2)
let roundedValue3 = ceil(value3)
let roundedValue4 = ceil(value4)
let roundedValue5 = ceil(value5)
let roundedValue6 = ceil(value6)
print(roundedValue1) // prints -0.0
print(roundedValue2) // prints -0.0
print(roundedValue3) // prints -1.0
print(roundedValue4) // prints 1.0
print(roundedValue5) // prints 1.0
print(roundedValue6) // prints 1.0
进行舍入并在同一操作中使用样式对其进行格式化,则可以使用NumberFormatter
。
NumberFormatter
答案 2 :(得分:20)
最正确的语法可能是:
var f: CGFloat = 2.5
var roundedF = CGFloat(ceil(Double(f)))
要使用ceil
,我会首先将CGFloat
设为Double
,然后在天花板之后将其转换回CGFloat
。
将CGFloat
定义为CFloat
或CDouble
时,该方法有效。
您还可以为浮点数定义ceil
(这实际上已在Swift 2中实现):
func ceil(f: CFloat) -> CFloat {
return ceilf(f)
}
然后你就可以直接打电话了
var roundedF: CGFloat = ceil(f)
同时保持类型安全。
我实际上认为这应该是Apple选择的解决方案,而不是单独的ceil
和ceilf
函数,因为它们在Swift中没有意义。
答案 3 :(得分:7)
答案 4 :(得分:5)
建立holex的答案。我做了
func accurateRound(value: Double) -> Int {
var d : Double = value - Double(Int(value))
if d < 0.5 {
return Int(value)
} else {
return Int(value) + 1
}
}
- 编辑扩展版 -
我最近也把它变成了Floats的扩展,以为我也会分享:)
extension Float {
func roundToInt() -> Int{
var value = Int(self)
var f = self - Float(value)
if f < 0.5{
return value
} else {
return value + 1
}
}
}
这使得你可以像
一样var f : Float = 3.3
f.roundToInt()
答案 5 :(得分:0)
快速使用5
let x = 6.5
// Equivalent to the C 'round' function:
print(x.rounded(.toNearestOrAwayFromZero))
// Prints "7.0"
// Equivalent to the C 'trunc' function:
print(x.rounded(.towardZero))
// Prints "6.0"
// Equivalent to the C 'ceil' function:
print(x.rounded(.up))
// Prints "7.0"
// Equivalent to the C 'floor' function:
print(x.rounded(.down))
// Prints "6.0"