Swift中的CGFloat打印

Swift中的CGFloat打印,swift,Swift,我正在尝试熟悉Swift并测试一些东西 有件奇怪的事我不明白 var count : NSInteger = 19 var percent : CGFloat = 22.01 var random : NSInteger = NSInteger(percent) NSLog("%d, %f, %d", count, percent, random); println("\(count), \(percent), \(random)") 它应该打印19,22.01,22,但日志是 1

我正在尝试熟悉Swift并测试一些东西

有件奇怪的事我不明白

var count : NSInteger   = 19
var percent : CGFloat   = 22.01
var random : NSInteger  = NSInteger(percent)

NSLog("%d, %f, %d", count, percent, random);
println("\(count), \(percent), \(random)")
它应该打印19,22.01,22,但日志是

19, 0.000000, 33875549
19, 22.0100002288818, 22
这里怎么了?在我删除类型说明符后,它在
println
中可以正常工作,而不是在
NSLog

知道为什么日志不正确吗


已添加


那println呢?使用
\()
无法打印22.01?

我猜您是在为32位iOS编译,其中
CGFloat
是32位
float

最接近22.01的
浮点值正好是22.0100002288818359375

最接近22.01的64位
double
正好是22.010000000000001563194018672220408916473388671875

看起来,Swift字符串插值将
double
转换为最短的字符串,该字符串将转换回完全相同的
double
。它将
float
转换为
double
(额外的位为零),然后将
double
转换为字符串,就好像一开始就给了它一个
double


转换回双精度(22.010000000000001563194018672220408916473388671875)的最短字符串是
22.01
。但是转换回
双精度(22.0100002288818359375)
的最短字符串是
22.0100002288818
,我猜您是为32位iOS编译的,
CGFloat
是32位
浮点

最接近22.01的
浮点值正好是22.0100002288818359375

最接近22.01的64位
double
正好是22.010000000000001563194018672220408916473388671875

看起来,Swift字符串插值将
double
转换为最短的字符串,该字符串将转换回完全相同的
double
。它将
float
转换为
double
(额外的位为零),然后将
double
转换为字符串,就好像一开始就给了它一个
double


转换回双精度(22.010000000000001563194018672220408916473388671875)的最短字符串是
22.01
。但是转换回双精度(22.0100002288818359375)
的最短字符串是
22.0100002288818

CGfloat很奇怪,因为它们可以是32位或64位,具体取决于系统。似乎NSLog与他们有问题。如果将百分比显式输入为浮点或双精度,它将正常工作。还可以使用cgfloat.native获取本机类型

NSLog("%d, %f, %d", count, percent.native, random);

CGfloat很奇怪,因为它们可以是32位或64位,具体取决于系统。似乎NSLog与他们有问题。如果将百分比显式输入为浮点或双精度,它将正常工作。还可以使用cgfloat.native获取本机类型

NSLog("%d, %f, %d", count, percent.native, random);

CGFloat
使用
%@
,它可以正常工作:

NSLog("%d, %@, %d", count, percent, random);

这是因为您可以在
CGFloat上调用
.description

CGFloat
使用
%@
,它可以正常工作:

NSLog("%d, %@, %d", count, percent, random);
这是因为您可以在
CGFloat
上调用
.description