Swift randomFloat问题:'4294967295'不能完全表示为'Float'[重复]

问题描述 投票:4回答:2

这个问题在这里已有答案:

生成随机CGFloat时,我使用以下代码。 Some explanation here

extension CGFloat{
     static func randomFloat(from:CGFloat, to:CGFloat) -> CGFloat {
          let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)
          return randomValue * (to - from ) + from
      } 
}

过去没关系。现在工作正常。

升级到Swift 5之后有一个警告。

'4294967295'并不能完全代表'Float';它变成'4294967296'

到代码行

let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)

怎么解决?

swift swift5
2个回答
7
投票

最简单的解决方案:放弃您的代码,只需调用https://developer.apple.com/documentation/coregraphics/cgfloat/2994408-random即可。


8
投票

如您所知,Float只有24位有效数字,因此32位值0xFFFFFFFF将被截断。因此,斯威夫特警告你,Float无法准确地代表0xFFFFFFFF的价值。

简短修复将是这样的:

let randomValue: CGFloat = CGFloat(Float(arc4random()) / Float(0xFFFFFFFF))

通过明确使用Float.init,Swift不会产生这样的警告。


但首选的方法是使用matz答案中建议的random(in:)方法:

return CGFloat(Float.random(in: from...to))

或者干脆:

return CGFloat.random(in: from...to)
© www.soinside.com 2019 - 2024. All rights reserved.