iOS的Objective-C如何获得2小数四舍五入浮点值?

我有一个

float a = 1412.244019; 

我需要四舍五入到最接近的第二个小数像1412.24000000。 我明白,如果我想提出只有两个小数我使用%.2f,但事实并非如此。 我需要新的math原因作为浮动。

我已经尝试了几个在stackoverflowfind没有运气的方法。 我使用的比较明显,我在下面提到,但仍然没有运气使用它。 你能明白为什么魔法不会发生吗?

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 

编辑:

SEEMS就像我在上述手术之后使用float a一样,现在认为是1412.240000,尽pipeNSLog的说法不一样…奇怪。 但我得到了我想要的东西,所以为了浪费时间而赞叹不已:)

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

你尝试过吗?

 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个小数位数

补充:你只是不能控制计算机如何存储浮点值。

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

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

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

不要使用浮动 – 除非你可以向某个人解释你的具体原因是什么。 浮动的精度非常有限。 因为有一个非常好的标准函数“round”,所以使用ceil或floor是愚蠢的。

float和double都不能精确表示大多数小数值,如12.24。 因为它有更高的精确度,双倍会让你更接近12.24。 因此,NSLog很可能会显示一些奇怪的数字(float)12.24,比如12.23999997394或其他什么,而它可能会显示12.24的double。

float可以有1412.24的最接近的值是1412.239990234375。 没有任何操作可以产生比这更近的float ,因为float对象的格式不代表任何更接近的值。 要求以floatforms表示1412.24就像是要求在int表示2.5。 它根本无法完成。

处理这个选项包括:

  • 您可以使用显示“1412.24”的使用格式,而不更改基础float对象。
  • 你可以使用double靠近(更接近),但它仍然不会完全是1412.24。
  • 您可以将float值缩放为可表示的值(例如,以其他单位进行度量,以便您希望的值全部都可以用float表示)。
  • 您可以使用不同的数据types,如NSDecimal

你可以乘以一个100.0,也许加四舍五入,然后取结果的整数值。 然后可以使用/ 100来获取小数点前的值和%100来得到两位小数。

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

其中一个build议是将所有的算术数字乘以100,然后除以你想显示的最终结果。 你可能有太多的数字,这将禁止这一点。

错误在这一行

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

纠正它

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