在Swift中打印CGFloat

时间:2014-09-19 01:46:07

标签: 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但是日志是......

19, 0.000000, 33875549
19, 22.0100002288818, 22

这里有什么问题?删除类型说明符后,它可以与println一起使用,而不是NSLog

任何想法为什么日志不正确?


ADDED

println怎么样?使用\()无法打印22.01?

3 个答案:

答案 0 :(得分:2)

我的猜测是你正在编译32位iOS,其中CGFloat是32位float

最接近的float到22.01正好是22.0100002288818359375。

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

似乎Swift字符串插值将double转换为最短的字符串,该字符串将转换回完全相同的double。它将float转换为double(额外位为零),然后将double转换为字符串,就好像它在第一个字符串中被赋予double一样的地方。

转换回Double(22.010000000000001563194018672220408916473388671875)的最短字符串为22.01。但转换回Double(22.0100002288818359375)的最短字符串为22.0100002288818

答案 1 :(得分:2)

CGFloats很奇怪,因为它们可以是32位或64位,具体取决于系统。看起来NSLog存在问题。如果明确键入百分比为Float或Double,它将正常工作。您还可以使用cgfloat.native获取本机类型。

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

答案 2 :(得分:2)

%@使用CGFloat,它可以正常运行:

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

这是有效的,因为您可以在.description上致电CGFloat