2014-09-19 148 views
1

我试图熟悉Swift并测试几件事情。在Swift中打印CGFloat

这是我无法理解的一件奇怪的事情。

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?

回答

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

2

CGFloats很奇怪,因为它们可以是32或64位,具体取决于系统。看来NSLog对他们有问题。如果你明确键入百分比作为浮点或双精度,它将正常工作。您也可以使用cgfloat.native获取本机类型。

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

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

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

这工作,因为你可以在CGFloat调用.description