Swift中Float转CGFloat精度异常,Double转却正常的原因?
为什么Float转CGFloat得到0.349999994039536,而Double转CGFloat却是0.35?
这其实是浮点数精度的经典“坑”,咱们从底层逻辑和类型特性一步步拆解:
1. Float与Double的精度差异
- Float是32位单精度浮点数:十进制的0.35无法用二进制浮点数精确表示,Float只能存储一个非常接近它的近似值——这个值实际就是
0.349999994039536。当你把这个Float实例转成CGFloat时,只是把这个已有的近似值直接转换过去,自然打印出来就是这个“奇怪”的数字。 - Double是64位双精度浮点数:同样,0.35也没办法被二进制精确存储,但Double的精度更高,它存储的近似值和0.35的误差极小,小到在默认打印时会被自动四舍五入成
0.35显示。
2. CGFloat的本质
在当前主流的64位iOS/macOS设备上,CGFloat其实是Double的类型别名。所以:
- Float转CGFloat,本质是把32位的近似值扩展为64位,但原有的精度误差不会消失;
- Double转CGFloat则是同精度的类型转换,误差小到肉眼几乎察觉不到。
代码验证
let float: Float = 0.35 let cgFloatFromFloat = CGFloat(float) print(cgFloatFromFloat) // 0.349999994039536 let double: Double = 0.35 let cgFloatFromDouble = CGFloat(double) print(cgFloatFromDouble) // 0.35
小技巧:解决显示问题
如果只是需要让输出看起来是0.35,可以用格式化字符串来控制显示精度:
print(String(format: "%.2f", cgFloatFromFloat)) // 输出 0.35
内容的提问来源于stack exchange,提问作者Anirudha Mahale
相关产品推荐
相关产品推荐

