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

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

4

1 回答 1

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

所以我怀疑这个错误是在lldb处理可变参数函数中。

您可以在LLVM bugzilla和/或Apple 的错误报告器(又名 rdar)上打开错误报告。

于 2012-07-07T04:40:59.873 回答