NSNumber floatValue 不等于 NSNumber 值

发布于 2024-09-01 09:21:51 字数 515 浏览 6 评论 0原文

第一篇文章在这里。 NSNumber 的 floatValue 方法有问题——不知何故,它返回一个不精确的数字。问题是:我将一堆 NSNumber 存储在一个数组中,如下所示:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

然后我尝试检索第一个值(例如): NSNumber n = (NSNumber) [a objectAtIndex:0]; CGFloat f = [n floatValue];

在调试器中,n 显示的值为 0.04(在摘要列中),但 f 显示的值为 0.0399999991。我在这里做错了什么?

谢谢大家。

First post here. Having a problem with NSNumber's floatValue method -- somehow, it returns an imprecise number. Here's the problem: I store a bunch of NSNumbers in an array, like this:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

Then I try to retrieve the first value (for example):
NSNumber n = (NSNumber) [a objectAtIndex:0];
CGFloat f = [n floatValue];

In the debugger, n shows a value of 0.04 (in the summary column), but f shows a value of 0.0399999991. What am I doing wrong here?

Thanks everyone.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

去了角落 2024-09-08 09:21:51

你没有做错任何事。这也不是 NSNumberCGFloat 特有的问题。浮点数是非常普遍的,它基于 2 的幂,而不是 10 的幂。您应该阅读此内容权威文章维基百科文章

重点是,标准浮点数只能准确表示 1/2、1/4、1/8、... 之和。
1/10 不是。因此,您无法使用标准浮点数完全准确地表示 0.1。

如果您确实需要处理它,可以使用处理有理分数或十进制浮点数的例程。

You're not doing anything wrong. That's not a problem specifically of NSNumber or CGFloat, either. It's something very universal about the floating point numbers, which is based on powers of 2, not powers of ten. You should read this definitive article or Wikipedia article.

The point is, the standard floating point numbers can only accurately represent a number which is a sum of 1/2, 1/4, 1/8, ... .
1/10 is not. So you can't completely accurately represent 0.1 using standard floating point numbers.

If you really do need to deal with it, there are routines which deal with rational fractions or decimal floating point numbers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文