【发布时间】:2011-01-29 13:30:18
【问题描述】:
这是一个简单的代码,显示了我认为处理双数时的错误...
double wtf = 36.76662445068359375000;
id xxx = [NSDecimalNumber numberWithDouble: wtf];
NSString *myBug = [xxx stringValue];
NSLog(@"%.20f", wtf);
NSLog(@"%@", myBug);
NSLog(@"-------\n");
终端会显示两个不同的数字
36.76662445068359375000 和
36.76662445068359168
这是一个错误还是我遗漏了什么?
如果第二个数字被四舍五入,顺便说一句,这是一个非常奇怪的四舍五入...
= = = = = = = = = =
我正在编辑原始问题以包含另一个 WTF 错误...
试试这个:
修改原始数字并将其截断为 10 位小数...所以...
double wtf = 36.76662445068359375000;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:10];
NSString *valueX = [formatter stringFromNumber:[NSDecimalNumber numberWithDouble:wtf]];
[formatter release];
NSLog(@"%@", valueX);
现在的答案是 36.7666244507
现在该值是一个包含 10 个十进制数字的字符串...现在让我们将其转换回双精度
double myDoubleAgain = [valueX doubleValue];
NSLog(@"%.20f", myDoubleAgain);
答案是 36.76662445070000018177 ??????
myDoubleAgain 现在有更多数字了!!!!
【问题讨论】:
-
真正的错误,而不是重复。看我的回答。
-
根本不是错误,而是在不考虑影响的情况下滥用 API。请参阅cimgf.com/2008/04/23/…,尤其是 cmets。 Marcus 是社区中备受尊敬的成员。
-
@Mike:您添加的新材料与原始问题无关(将双精度导入 NSDecimalNumber 的问题)。这是尝试将小数表示为浮点数的副作用。请参阅 Mauricio 和 Nathan 链接到的参考资料。
标签: iphone cocoa iphone-sdk-3.0