繁体   English   中英

在Swift中从Float转换为CGFloat

[英]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”。

这与floatdouble一起运行的方式是:

  • 转换为double ,.35变成0.3499999999999999777955393950749686919152736663818359375。 使用上述方法打印时,结果为“ 0.35”。
  • 转换为float ,.35变为0.3499999940395355224609375。 使用上述方法打印时,结果为“ 0.349999994039536”。

因此, floatdouble float值都不同于0.35,但是用于打印的格式没有使用足够的数字来显示double float值的偏差,而在打印格式中却使用了足够的数字来显示float值的偏差。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM