iOS设置双值是错误的

时间:2014-04-22 22:39:09

标签: ios objective-c double

我找到了答案但找不到答案。我正在开发一个使用利率的iOS 7应用程序。我已声明如下:

double InterestRate;
InterestRate = 3.9;

我将按钮标签设置为打印兴趣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%

所以,我在Segue中向PopOver发送InterestRate的时候设置了断点,我发现iOS将3.9报告为3.8999999999999。

我特意将它设置为3.9。有没有更好的方法呢?我发现基本上如果我将设置设置为3.9,那么它将被iOS报告为3.8999999999999。

任何想法?

-UPDATE:

好的,这被标记为重复。但是,我不是使用浮动,而是使用浮动。不确定它是否有很大的不同,但似乎并不是一个答案。如果我声明double = 3.9,那么我看它所说的值是3.89999999999999。这绝对不一样。所以,我的基本问题是处理这个问题的最佳方法是什么?我需要3.9总是等于3.9,而不是3.89999999999999。如果这是一个重复的问题,为什么链接不会给出如何处理它的简单直接答案,而是对问题的长期解释。我知道有问题。我正在寻找答案。

1 个答案:

答案 0 :(得分:1)

它与double s(即浮点数)的存储方式有关(有关详细信息,请参阅this问题。)。

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

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

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