【问题标题】:How to round a float to 2 decimal places?如何将浮点数四舍五入到小数点后两位?
【发布时间】:2012-11-11 02:46:31
【问题描述】:

这是我计算游戏速度的算法。

self.speed=.7-self.score/50;

现在如何将 self.speed 舍入到小数点后 2 位?

【问题讨论】:

标签: objective-c ios floating-point


【解决方案1】:

注意:我的回答假设您只关心小数位数,以便向用户显示值。

当您设置 NSNumberFormatter 将数字格式化为字符串以供显示时,请设置格式器最多保留两位小数。

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2];

NSString *formattedNumber = [formatter stringFromNumber:@(self.speed)];

如果您需要特定的回合方法,您可以选择使用setRoundingMode: 方法。

顺便说一句 - 您不应该为此使用字符串格式,因为它没有考虑用户的语言环境来正确格式化数字。

【讨论】:

  • +1 表示不建议将四舍五入的版本表示为二进制浮点数,这是没有意义的。
【解决方案2】:

浮点数以 IEEE754 格式处理,您无法直接决定使用多少小数位。您可以直接决定使用多少位,或间接将数字的 las 部分四舍五入:

NSString* str=[NSString stringWithFormat: @"%.2f", number];
number= atof([str UTF8String]);

但就像 maddy 指出的那样,只有在向用户显示数字时才需要舍入/截断不需要的十进制数字,因此在打印时只能使用 %.2f 格式说明符,或使用格式化程序。

【讨论】:

  • FWIW,有时人们出于各种原因确实需要计算到小数位,在这种情况下,他们需要使用定点或而是十进制数学库。
【解决方案3】:
self.speed = (int)(self.speed * 100 + 0.5) / 100.0;

如果你想把它作为一个字符串:

NSString *speedString = [NSString stringWithFormat: @"%.2f", self.speed];

【讨论】:

  • 使用字符串格式的缺点是数字格式不适合大多数语言环境中的用户。许多人希望小数点分隔符使用逗号,但字符串格式将使用句点。 NSNumberFormatter 是一种更友好的方法。
  • 这个答案顶部的“四舍五入”实际上不起作用,因为 IEEE 浮点使用以 2 为底的指数。 (至少,除非您有一个支持十进制浮点的系统,但这种情况很少见)。有关此主题的更多信息,请参阅stackoverflow.com/questions/829067/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多