在Swift中从Float转换为CGFloat

时间:2018-05-02 08:17:41

标签: swift floating-point type-conversion cgfloat

我正在转换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

1 个答案:

答案 0 :(得分:1)

将“.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值的偏差。