stringWithFormat浮动的奇怪行为

时间:2012-07-07 04:18:48

标签: ios floating-point nsstring lldb

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

有人理解这里的行为吗?我在设备上运行。

1 个答案:

答案 0 :(得分:4)

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

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)打开错误报告。