我正在转换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
答案 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”。 float
和double
的运作方式是:
double
时,。35变为0.34999999999999997779553950749686919152736663818359375。使用上述方法打印时,结果为“0.35”。float
时,。35变为0.3499999940395355224609375。使用上述方法打印时,结果为“0.349999994039536”。因此,float
和double
值都不同于.35,但打印格式不会使用足够的数字来显示double
值的偏差,而它会使用足够的数字来显示float
值的偏差。