【问题标题】:iOS setting double value is wrong [duplicate]iOS设置双精度值错误[重复]
【发布时间】:2014-04-22 22:39:09
【问题描述】:

我一直在寻找答案,但找不到。我正在开发一个使用利率的 iOS 7 应用程序。我已经声明了以下内容:

double InterestRate;
InterestRate = 3.9;

我将按钮标签设置为打印 Interest 3.9% 并且效果很好:

[btnInterest setTitle:[NSString stringWithFormat:@"Interest %.2f%%",InterestRate] forState:UIControlStateNormal];

然后,当有人单击按钮时,我会将其发送到我的 PopOver 窗口,如下所示:

if ([[segue identifier] isEqualToString:@"InterestController"])
{
    CC_InterestViewController *vc = [segue destinationViewController];
    vc.delegate = self;
    [vc setInterestRate:InterestRate];   <---- BREAKPOINT HERE!!!!! (See Below)
}

我的 PopOver 收到的内容如下:

-(void)setInterestRate:(double)rate
{
    interestRate = rate;
}

然后我将 3.9 分成不同的部分,因此我可以使用两列将它们分成 UIPickerview 以选择利率。唯一的问题是我得到:

3.89% 不是 3.9%

所以,我在将 InterestRate 从 Segue 发送到 PopOver 的点设置了一个断点,我发现 iOS 将我的 3.9 报告为 3.8999999999999。

我专门将其设置为 3.9。有没有更好的方法来做到这一点?我发现基本上如果我将设置设置为 3.9,然后 iOS 将报告为 3.8999999999999。

有什么想法吗?

-更新:

好的,这被标记为重复。但是,我使用的不是浮点数,而是双精度数。不确定它是否有很大的不同,但似乎没有答案。如果我声明 double = 3.9,然后我查看它的值,它说它是 3.89999999999999。这绝对不一样。所以,我的基本问题是处理这个问题的最佳方法是什么?我需要 3.9 始终等于 3.9,而不是 3.89999999999999。如果这是一个重复的问题,那么该链接为什么没有给出一个简单直接的答案来说明如何处理它,而是对这个问题进行了冗长的解释。我知道有问题。我正在寻找答案。

【问题讨论】:

  • 这个已经讲过很多次了。浮点值不精确。

标签: ios objective-c double


【解决方案1】:

这与doubles(即浮点数)的存储方式有关(有关更多信息,请参阅this 问题。)。

如果您想要准确的结果,请使用NSDecimalNumber。有执行arithmetic的基本方法(加、减、乘、除)。

NSDecimalNumber *interestRate = [NSDecimalNumber decimalNumberWithMantissa:39 exponent:-1 isNegative:NO];

要将NSDecmialNumber 显示为字符串,请使用NSNumberFormatter

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 2021-04-02
    • 2016-12-29
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多