Swift randomFloat问题:“ 4294967295”不能完全表示为“ Float”

时间:2019-04-07 15:42:11

标签: swift swift5

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

html, body {
    /* this seems not to solve the problem */
    overflow: hidden;
    -webkit-overflow-scrolling: auto;
}

.scrollable-div {
    overflow-x: hidden;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;

    /* div has a fixed position */
    position: fixed;
    top: 3em;
    right: 3em;
    bottom: 3em;
    left: 3em;

    /* just for styling */
    background-color: #999999;
}

曾经很好。现在工作正常。

我升级到Swift 5后出现警告。

  

'4294967295'不能完全表示为'Float';它变为“ 4294967296”

到代码行

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

如何解决?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

您知道Float仅具有24位有效数,因此32位值0xFFFFFFFF将被截断。因此,Swift向您警告Float不能精确表示值0xFFFFFFFF

简短的解决方法是这样的:

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

显式使用Float.init时,Swift不会生成此类警告。


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

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

或简单地:

return CGFloat.random(in: from...to)
相关问题