如何将浮点值舍入到小数点后2位?

时间:2009-05-06 10:57:54

标签: objective-c cocoa-touch uikit

我从加速度计得到一个漂浮值,如下所示:

-3.04299553323

我想以-3.04为例。是否有一种简单的方法来舍入浮动值?

编辑:

  

Rounding numbers in Objective-C

4 个答案:

答案 0 :(得分:39)

我知道这是旧帖子,但以防其他人正在寻找快速的两步选项。

float old = -3.04299553323;  
float new = [[NSString stringWithFormat:@"%.2f",old]floatValue];

结果= -3.04

@“%。2f”将四舍五入到小数点后两位。如果你想要三个小数位放 @“%。3f”等等。

希望这有帮助!

答案 1 :(得分:32)

您应该只在格式化数字以便向最终用户显示时执行此操作,因为无法保证

float rounded = roundf(orig * 100) / 100.0;

或类似的将返回一个确切的答案。

事实上,一般情况下,它不会。例如,考虑

float f = 123456.3;
float r = roundf(f * 100) / 100.0;

printf("%.2f, %.10f\n", r, r);

输出

123456.30, 123456.2968750000

糟糕!

使用double而不是float会有所帮助,但即便如此,如果我们稍微更改一下代码,您会发现它并没有真正解决问题:

double f = 123456.3;
double r = round(f * 100) / 100.0;

printf("%.2f, %.20f\n", r, r);

再次,我们得到

123456.30, 123456.30000000000291038305

非常清楚地表明它并非完全圆润。

无论如何,故事的寓意是,像round(f * 100) / 100.0这样的事情只会围绕近似。在某些情况下它可能已经足够好了,但你需要记住结果不是真的舍入。

如果你想要更好的东西,你需要使用十进制算术。您可以通过将值保持为整数来实现此目的(例如,对于货币值,将它们保持为便士或美分而不是磅或美元),或者使用您可以找到的各种十进制浮点包之一on Wikipedia's Decimal Floating Point page

答案 2 :(得分:1)

将它乘以100,(如果需要,向上/向下舍入到最接近的整数),取整数部分,然后再除以100

适用于任何小数位数,乘以/除以10 ^(小数位数)。

答案 3 :(得分:1)

我只是发布了我对这个问题的回答,因为这是让我快速完成工作的唯一方法,因为我合并了两个给定的答案,在iPad应用中向用户显示一个圆形浮点值:

NSString *roundedAmount = [NSString stringWithFormat:@"%.2f", round ((floatValue / 1024) * 100.0) / 100.0];