2011-07-25 46 views
0

我无法实现舍入浮动。iPhone - 舍入浮动不起作用

那些调用返回给我3.5999999,而不是3.6 foroTimeoutTrick和theoTimeout。
我怎样才能将3.6的值变成NSString和float vars?

#define minTimeout 1.0 
#define defaultNbRetry 5 

    float secondsWaitedForAnswer = 20.0; 
    float minDelayBetween2Retry = 0.5; 

    int theoNbRetries = defaultNbRetry; 
    float theoTimeout = 0.0; 

    while (theoTimeout < minTimeout && theoNbRetries > 0) { 
     theoTimeout = (secondsWaitedForAnswer - (theoNbRetries-1)*minDelayBetween2Retry)/theoNbRetries; 
     theoNbRetries--; 
    } 

    float theoTimeoutTrick = [[NSString stringWithFormat:@"%.1f", theoTimeout] floatValue]; 
    theoTimeout = roundf(theoTimeout * 10)/10.0; 
+0

3.6不能精确地用二进制表示,并且有很多数字。 –

+0

@ Kerrek SB:我可以理解,但我不在乎。我必须显示3.6,这是正确的四舍五入值。例如,你有没有在你的银行账户上看过这样的小数? – Oliver

+6

我敢肯定我的银行账户不会使用IEEE浮点数作为余额! (主要是因为他们的范围有限:-))。使用格式化输出来打印适当的四舍五入值。 –

回答

3

Rounding numbers in Objective-C

float roundedValue = round(2.0f * number)/2.0f; 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:1]; 
[formatter setRoundingMode: NSNumberFormatterRoundDown]; 

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:roundedValue]]; 
[formatter release]; 

,将让你一个圆形的字符串。我敢肯定,你可以把它解析成一个浮点数。

好了,这里的一些测试代码和一些成果:

NSLog(@"%f", round(10*3.56)/10.0); 
    =>3.600000 
NSLog(@"%f", round(10*3.54)/10.0); 
    =>3.500000 
NSLog(@"%f", round(10*3.14)/10.0); 
    =>3.100000 

好吧,你知道吗?您的原始代码可以在我的机器OSX 10.6和Xcode 4上正常工作。您是如何看到您的输出的?

+0

@Oliver:该帖子的问题是要求舍入到最接近的0.5,所以他在乘以2后舍入,然后将结果除以2.如果要舍入到最接近的整数,可以使用'[formatter setMaximumFractionDigits:0]'。 – bdares

+0

Oucchhhh ...我是说... Ouucchhh!什么f ....呃,因为圆型的作品不太好。我只得到3.5。两个问题:这里使用2.0f是什么?我可以使用什么NSNumberFormatter常量来使用常用方法舍入小数(您知道直到0.5向下舍入,并且0.5和更多舍入)? – Oliver

+0

如果你需要5秒钟搜索'NSNumberFormatterRoundDown'文件,你会找到答案... –