在 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 都会产生不同于 .35 的值,因为浮点格式使用二进制基数,所以精确的数学值必须使用 2 的幂(在这种情况下为 2 的负幂)来近似。

由于 float 格式使用的位数较少,因此其结果不太精确,在本例中也不太准确。 float值为0.3499999940395355224609375,double值为0.34999999999999997779553950749686919152736663818359375.

我不完全熟悉 Swift,但我怀疑它用来将 CGFloat 转换为十进制(使用默认选项)的算法类似于:

  • 生成固定的小数位数,从 CGFloat 的实际值正​​确舍入到位数,然后抑制任何尾随零。例如,如果精确的数学值是0.34999999999999997…,格式化使用15位有效数字,则中间结果是“0.350000000000000”,然后将其简写为“0.35”。

floatdouble 的操作方式是:

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

因此,floatdouble 值都不同于 .35,但是打印格式没有使用足够的数字来显示 double 值的偏差,而它确实使用了足够的数字来显示 float 值的偏差。