需要关于随机函数swift的解释

问题描述 投票:3回答:1

对我的随机功能有疑问:为什么会出现这个错误?

'4294967295' is not exactly representable as 'Float'; it becomes '4294967296'

-

我的代码是

func random() ->CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func  random(min: CGFloat, max: CGFloat) -> CGFloat {
    return random() * (max - min) + min
}

它不会改变应用程序的功能,但它只是无处不在。

提前致谢!

swift random
1个回答
7
投票

IEEE 754 32-bit floating point数字对于尾数有24个有效位,这不足以准确存储10位整数:

print(0xFFFFFFFF)             // 4294967295
print(Float(0xFFFFFFFF))      // 4.2949673e+09
print(Int(Float(0xFFFFFFFF))) // 4294967296

这不会影响你的代码,因为

Float(arc4random()) / Float(0xFFFFFFFF)

仍然是介于0.0和1.0之间的浮点数。将计算更改为

return CGFloat(arc4random()) / 0xFFFFFFFF

将在64位平台上修复警告:整数常量现在转换为(64位)Double

但是从Swift 4.2开始,你可以通过使用新的Random API完全避免这个问题:

func random(min: CGFloat, max: CGFloat) -> CGFloat {
    return CGFloat.random(in: min...max)
}
© www.soinside.com 2019 - 2024. All rights reserved.