gpt4 book ai didi

iphone - cocoa - 我发现了 NSDecimalNumber 的一个错误

转载 作者:行者123 更新时间:2023-12-03 16:10:20 24 4
gpt4 key购买 nike

这是一个简单的代码,显示了我认为处理双数时的错误...

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

double myDoubleAgain = [valueX doubleValue];
NSLog(@"%.20f", myDoubleAgain);

答案是 36.76662445070000018177 ??????

myDoubleAgain 现在有更多位数!!!

最佳答案

通常情况下,我会进来并向人们解释他们输入的数字不能表示为 float ,以及舍入错误在哪里,等等等等。

这个问题比我们通常看到的有趣得多,它准确地说明了“浮点不精确,请阅读“每个计算机科学家都应该知道的内容”的大众智慧的错误所在...... '哈哈”。

36.76662445068359375 不仅仅是任何 19 位十进制数。它恰好是一个 19 位十进制数,也可以用 double 二进制 float 精确表示。因此,初始转换隐含在:

double wtf = 36.76662445068359375000;

是准确的。 wtf 恰好包含 b100100.11000100010000011,并且未发生舍入。

NSDecimalNumber 的规范表示,它将数字表示为 38 位十进制尾数和 [-127,128] 范围内的十进制指数,因此 wtf 中的值也可以完全表示为 NSDecimalNumber。因此,我们可以得出结论:numberWithDouble 未提供正确的转换。尽管我找不到声称此转换例程已正确舍入的文档,但没有充分的理由不这样做。 这是一个真正的错误please report it .

我注意到 iPhoneOS 上的字符串格式化程序似乎可以提供正确的舍入结果,因此您可以通过首先将 double 格式格式化为具有 38 位精度的字符串,然后使用 decimalNumberWithString 来解决此问题。并不理想,但它可能适合您。

关于iphone - cocoa - 我发现了 NSDecimalNumber 的一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com