29

我有一个

float a = 1412.244019;

我需要将 a 四舍五入到最接近的小数点后二位,例如 1412.24000000。我知道如果我只想用两位小数表示 a,我会使用 %.2f,但事实并非如此。出于数学原因,我需要新的 a 作为浮点数。

我尝试了几种在stackoverflow上找到的方法,但没有运气。我使用的更明显的一个,我在下面提到,但仍然没有运气使用它。你能明白为什么魔法没有发生吗?

PS:它有时确实会产生预期的效果,但并非总是如此,这让我思考......嗯......

提前致谢。

代码:

float a = 1412.244019;
NSLog(@"a is %f", a); //output a is 1412.244019
a = [[NSString stringWithFormat:@"%.2f", a] floatValue];
NSLog(@"a is %f", a); //output a is 1412.239990

编辑:

似乎当我在上述手术后使用浮动 a 时,它认为它是 1412.240000,尽管 NSLog 说的不同......奇怪。但我得到了我想要的东西,所以浪费时间什么都不追了:)

编辑我很乐意选择你们所有人作为正确答案,但由于我只能选择一个,我选择了第一个带有额外解释的好答案(最后两个)。

4

6 回答 6

60

你试过这个吗?

CGFloat val = 37.777779;

CGFloat rounded_down = floorf(val * 100) / 100;   /* Result: 37.77 */
CGFloat nearest = floorf(val * 100 + 0.5) / 100;  /* Result: 37.78 */
CGFloat rounded_up = ceilf(val * 100) / 100;      /* Result: 37.78 */

来源:将数字四舍五入到 C 中的 2 个小数位

补充:您只是无法控制计算机如何存储浮点值。

所以这些四舍五入的值可能不完全是“明显的”十进制值,但它们会非常接近,这是您将拥有的最大保证。

于 2013-08-05T17:19:55.210 回答
11

您在 Objective-C 中的操作与在 C 中的操作完全相同:

double notRounded = ...;
double rounded = round (notRounded * 100.0) / 100.0;

不要使用 float - 除非您可以向某人确切解释您使用 float 而不是 double 的具体原因。float 的精度非常有限。并且使用 ceil 或 floor 是愚蠢的,因为有一个非常精细的标准函数名为“round”。

float 和 double 都不能准确表示大多数十进制值,例如 12.24。因为它具有更高的精度,所以 double 会让你更接近 12.24。因此,NSLog 很有可能会为 (float) 12.24 显示一些奇怪的数字,例如 12.23999997394 或其他任何数字,而它可能会显示 12.24 作为双精度数。

于 2014-03-20T17:28:03.723 回答
6

此行有错误

a = [[NSString stringWithFormat:@"%.2f", a] floatValue];

改正为

a = [NSString stringWithFormat:@"%.02f", a];
于 2017-07-31T09:37:04.040 回答
5

a 可以拥有的最接近 1412.24 的值float是 1412.239990234375。没有比这更接近操作了float,因为float对象的格式不代表任何更接近的值。要求代表 1412.24 infloat就像要求代表 2.5 in int。根本做不到。

处理此问题的选项包括:

  • 您可以使用显示“1412.24”的格式,而无需更改基础float对象。
  • 您可以使用double更接近(更接近),但它仍然不会完全是 1412.24。
  • 您可以将值缩放float为可表示的值(例如,以其他单位测量,以便您想要的值都可以在 中精确表示float)。
  • 您可以使用不同的数据类型,例如NSDecimal.
于 2013-08-05T17:27:00.683 回答
2

您不能强制使用浮点值。浮点数被设计为有点近似,因为它们的大小可能很大,而且由于你只有这么多位要使用,它可以接近但不能精确地表示十进制数。

一个建议是用整数进行所有算术运算,乘以 100,然后在您想要显示最终结果时进行除法。您可能有太大的数字会禁止这样做。

于 2013-08-05T17:20:47.183 回答
2

您可以将 a 乘以 100.0 并可能添加 0.5 进行舍入,然后取结果的 int 值。然后,您可以使用 /100 获取小数点前的值,使用 % 100 获取小数点后两位。

于 2013-08-05T17:14:40.410 回答