Swift randomFloat 问题:“4294967295”不能完全表示为 'Float'
Swift randomFloat issue: '4294967295' is not exactly representable as 'Float'
生成随机 CGFloat 时,我使用了以下代码。
extension CGFloat{
static func randomFloat(from:CGFloat, to:CGFloat) -> CGFloat {
let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)
return randomValue * (to - from ) + from
}
}
以前还可以。现在工作正常。
升级到Swift5.
后出现警告
'4294967295' is not exactly representable as 'Float'; it becomes '4294967296'
到代码行
let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)
如何解决?
最简单的解决方案:放弃您的代码,只需调用 https://developer.apple.com/documentation/coregraphics/cgfloat/2994408-random。
如您所知,Float
只有 24 位有效数字,因此 32 位值 0xFFFFFFFF 将被截断。因此,Swift 警告您 Float
不能精确表示值 0xFFFFFFFF
。
简短的修复是这样的:
let randomValue: CGFloat = CGFloat(Float(arc4random()) / Float(0xFFFFFFFF))
如果明确使用 Float.init
,Swift 将不会生成此类警告。
但首选方法是使用 random(in:)
方法,如 matt 的回答中所建议的:
return CGFloat(Float.random(in: from...to))
或者简单地说:
return CGFloat.random(in: from...to)
生成随机 CGFloat 时,我使用了以下代码。
extension CGFloat{
static func randomFloat(from:CGFloat, to:CGFloat) -> CGFloat {
let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)
return randomValue * (to - from ) + from
}
}
以前还可以。现在工作正常。
升级到Swift5.
后出现警告'4294967295' is not exactly representable as 'Float'; it becomes '4294967296'
到代码行
let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)
如何解决?
最简单的解决方案:放弃您的代码,只需调用 https://developer.apple.com/documentation/coregraphics/cgfloat/2994408-random。
如您所知,Float
只有 24 位有效数字,因此 32 位值 0xFFFFFFFF 将被截断。因此,Swift 警告您 Float
不能精确表示值 0xFFFFFFFF
。
简短的修复是这样的:
let randomValue: CGFloat = CGFloat(Float(arc4random()) / Float(0xFFFFFFFF))
如果明确使用 Float.init
,Swift 将不会生成此类警告。
但首选方法是使用 random(in:)
方法,如 matt 的回答中所建议的:
return CGFloat(Float.random(in: from...to))
或者简单地说:
return CGFloat.random(in: from...to)