2012-07-07 52 views
3
(lldb) po [NSString stringWithFormat:@"%.1f", 0.01] 
(id) $21 = 0x003a2560 19991592471028323832250853378750414848.0 
(lldb) po [NSString stringWithFormat:@"%.1f", 0.1] 
(id) $22 = 0x0de92240 -0.0 

有没有人知道这里的行为?我在设备上运行。stringWithFormat的奇怪行为float

回答

4

这是lldb中的一个错误。如果您在gdb中尝试相同的操作,则它可以正常工作。我怀疑lldb只传递参数的低32位。的0.01和它的打印数的IEEE表示是这些:

47ae147b3778df69 = 19991592471028323832250853378750414848.00 
3f847ae147ae147b = 0.01 

注意0.01匹配的低32位的其它数的高32位。

的错误也恰好与printf

(lldb) expr (void)printf("%.1f\n", 0.01) 
19991592257096858016910903319197646848.0 
<no result> 

它不+[NSNumber numberWithDouble:]发生:

(lldb) po [NSNumber numberWithDouble:0.01] 
(id) $3 = 0x0fe81390 0.01 

所以我怀疑这个bug是lldb的处理的可变参数的功能。

您可以在the LLVM bugzilla和/或Apple's bug reporter (aka rdar)处打开错误报告。

+0

从Xcode 4.4开始,此错误已得到修复。 – 2012-08-17 20:59:50