You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:12:48