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

Tha*_*nks 12 cocoa-touch objective-c uikit

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

-3.04299553323

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

编辑:

Objective-C中的舍入数字

Fli*_*Fun 39

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

float old = -3.04299553323;  
float new = [[NSString stringWithFormat:@"%.2f",old]floatValue];
Run Code Online (Sandbox Code Playgroud)

结果= -3.04

@"%2F"将四舍五入到小数点后两位.如果你想把三个小数位放在@"%.3f"等等.

希望这可以帮助!

  • 这比*round(old*100.0)/ 100.0`慢*并且没有更好; 像后者一样,它实际上并没有舍入到两个小数位,因为你使用带有*binary*指数的浮点数(因此在所有情况下都无法准确表示十进制值). (2认同)

ala*_*air 32

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

float rounded = roundf(orig * 100) / 100.0;
Run Code Online (Sandbox Code Playgroud)

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

实际上,总的来说,它不会.比如考虑一下

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

printf("%.2f, %.10f\n", r, r);
Run Code Online (Sandbox Code Playgroud)

哪个输出

123456.30, 123456.2968750000
Run Code Online (Sandbox Code Playgroud)

哎呀!

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

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

printf("%.2f, %.20f\n", r, r);
Run Code Online (Sandbox Code Playgroud)

我们再次得到

123456.30, 123456.30000000000291038305
Run Code Online (Sandbox Code Playgroud)

这清楚地表明它并不是完全圆润的.

不管怎么说,这个故事的寓意是,做这样的事情round(f * 100) / 100.0只是一个轮.在某些情况下它可能已经足够好了,但你需要记住结果并不是真正的四舍五入.

如果你想要更好的东西,你需要使用十进制算术.您可以通过将值保持为整数来实现此目的(例如,对于货币值,将它们保持为便士或美分而不是磅或美元),或者使用维基百科的十进制浮点页面上可以找到的各种十进制浮点包之一.


小智 1

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

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