[英]Conversion from Float to CGFloat in Swift
我正在转换Float
=> CGFloat
,它给了我以下结果。 为什么转换后显示为“ 0.349999994039536”,但在Double
=> CGFloat
可以正常使用?
let float: Float = 0.35
let cgFloat = CGFloat(float)
print(cgFloat)
// 0.349999994039536
let double: Double = 0.35
let cgFloat = CGFloat(double)
print(cgFloat)
// 0.35
将“ .35”转换为float
并将“ .35”转换为double
float
值都产生不同于.35的值,因为浮点格式使用二进制基数,因此必须使用2的幂(负数)来近似精确的数学值在这种情况下为2的幂)。
由于float
格式使用较少的位,因此其结果精度不高,在这种情况下,精度也不高。 float
值为0.3499999940395355224609375, double
精度值为0.349999999999999999997779553950749686919152736663818359375。
我并不完全熟悉Swift,但是我怀疑它用来将CGFloat
转换为十进制(带有默认选项)的算法类似于:
CGFloat
的实际值四舍五入到正确的数字,然后抑制任何尾随零。 例如,如果精确的数学值为0.34999999999999997…,并且格式使用15个有效数字,则中间结果为“ 0.350000000000000”,然后将其缩写为“ 0.35”。 这与float
和double
一起运行的方式是:
double
,.35变成0.3499999999999999777955393950749686919152736663818359375。 使用上述方法打印时,结果为“ 0.35”。 float
,.35变为0.3499999940395355224609375。 使用上述方法打印时,结果为“ 0.349999994039536”。 因此, float
和double
float
值都不同于0.35,但是用于打印的格式没有使用足够的数字来显示double
float
值的偏差,而在打印格式中却使用了足够的数字来显示float
值的偏差。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.