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