Objective c 如何将浮点值四舍五入到小数点后的两个位置?

Objective c 如何将浮点值四舍五入到小数点后的两个位置?,objective-c,cocoa-touch,uikit,Objective C,Cocoa Touch,Uikit,我从一个加速计得到一个浮点值,如下所示: -3.04299553323 例如,我想得到-3.04。有没有一种简单的方法来舍入浮点值 编辑: 将其乘以100(如有必要,向上/向下取整至最接近的整数),取整数部分,然后再次除以100 适用于任何小数位数,乘以/除以10^(小数位数)。您只能在格式化数字以显示给最终用户时执行此操作,因为无法保证 float rounded = roundf(orig * 100) / 100.0; 或类似的将返回准确的答案 事实上,总的来说,它不会。例如考虑 fl

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

-3.04299553323

例如,我想得到-3.04。有没有一种简单的方法来舍入浮点值

编辑:

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


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

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

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
这样的操作只会在左右进行循环。在某些情况下,它可能足够好,但您需要记住,结果并不是真正的四舍五入


如果你想要更好的东西,你需要用十进制算术来代替。您可以通过将值保留为整数(例如,对于货币值,将它们保留为便士或美分,而不是英镑或美元),或者使用您可以找到的各种十进制浮点包中的一种来实现这一点。

我知道这是一篇老文章,但以防其他人正在寻找快速的两步选择

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

@“%.2f”将四舍五入到小数点后两位。如果需要小数点后三位,请输入“%.3f”
,以此类推


希望这有帮助

我刚刚发布了我对这个问题的答案,因为这是我快速完成这项工作的唯一方法,因为我合并了两个给定的答案,在iPad应用程序中向用户显示一个四舍五入的浮点值:

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

请参阅我上面的评论,这也适用于此“解决方案”。@alastair,所以没有办法做到这一点?正如我在上面的回答中所说,正确的方法是将数据表示为整数(并根据需要自己添加小数点),或者使用十进制算术包。对于许多应用程序,您可以通过近似四舍五入和小心使用
printf()
说明符来解决问题,但您需要了解,数字并不是真正四舍五入的,即使它们看起来可能是这样的。回答不错,谢谢。我决定使用定点表示法。在最后一段中,应该提到小数位数。125456.355怎么样?它应该给你125456.35而不是125456。36@Ramshad取决于您使用的舍入类型。如果您使用的是向上取整或从零开始取整,则125456.36是正确的结果。但是你看,这里的要点是浮点数是用二进制表示的,而不是十进制。如果需要特定的十进制舍入行为,则需要使用十进制算术-定点(将值保持为整数乘以10的幂)或十进制浮点(通过各种包)。我认为这应该可以工作-NSNumberFormatter Formatter SS=[[NSNumberFormatter alloc]init];[格式化程序setPositiveFormat:@“0.##”];NSString formattedSum=[formatterss stringFromNumber:@(125456.355)];NSLog(@“%@”,[NSString stringWithFormat:@“%.2f”,[formattedSum floatValue]];浮点数的可能重复项不能四舍五入到给定的小数位数。它们只有在转换为字符串时才能舍入。我只是做了一个编辑来添加结果,只是为了清晰。这比
舍入(旧*100.0)/100.0
慢得多,也不比后者好多少;与后者一样,它实际上不会四舍五入到小数点后两位,因为您使用的是带二进制指数的浮点(因此无法在所有情况下准确表示十进制值)。对于这样一个简单的操作来说,这太过分了如果只是为了显示,
[NSString stringWithFormat:@“%.2f”,floatValue/1024]
应该可以工作,没有对
round
的无意义调用。