【问题标题】:iPhone - Rounding a float does not workiPhone - 舍入浮点数不起作用
【发布时间】:2011-07-25 00:10:36
【问题描述】:

我无法实现浮点数的四舍五入。

对于 theoTimeoutTrick 和 theoTimeout,这些调用都返回 3.5999999 而不是 3.6。
我如何才能将 3.6 的值放入 NSString AND 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;

【问题讨论】:

  • 3.6 不能用有限多位二进制精确表示。
  • 我确定我的银行账户没有使用 IEEE 浮点数作为我的余额! (主要是因为它们的范围有限:-))。使用格式化输出打印适当的舍入值。
  • 您在实际输出到字符串时进行格式化。我所能看到的只是分配浮点数和整数。你的输出打印在哪里?
  • 或者,使用 NSDecimal 和 NSDecimalNumber。
  • @Kerrek 货币处理软件通常使用二进制编码的十进制 (BED),每个数字使用 4 位。但是,如果您尝试类似NSLog(@"%f", 3.6); 的方法,您会发现它确实打印了3.60000

标签: objective-c cocoa floating-point rounding


【解决方案1】:

来自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 上按预期工作。您看到输出的具体情况如何?

【讨论】:

  • @Oliver:那个帖子的问题是要求四舍五入到最接近的 0.5,所以他在乘以 2 后四舍五入,然后将结果除以 2。如果你想四舍五入,可以使用 [formatter setMaximumFractionDigits:0]最接近的整数。
  • 哎呀……我的意思是……哎呀!什么f....好吧,因为圆形,所以效果不太好。我才3.5。两个问题:这里2.0f有什么用?我可以用什么 NSNumberFormatter 常量用常用方法舍入小数(你知道直到 0.5 向下舍入,而 0.5 及更多则向上舍入)?
  • 如果您花五秒钟时间在文档中搜索NSNumberFormatterRoundDown,您就会找到答案……
  • @bdares : 我只想在这里得到 3.6
  • @Rob Keniger:啊啊啊。不工作。我当然读过文档。如果我设置 float roundedValue = 3.56;我只得到 3.5,而我应该得到 3.6。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多