我正在尝试熟悉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?
答案 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
。