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

时间:2013-08-05 17:06:46

标签: ios objective-c floating-point decimal rounding

我有一个

float a = 1412.244019;

我需要将四舍五入到最接近的第二个小数,如1412.24000000。我明白,如果我想要只用两位小数来表示我使用%.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

修改

SEEMS就像我在上述手术后使用浮子一样,它正在考虑它是1412.240000,尽管NSLog说的不同......奇怪。 但是我得到了我想要的东西,所以感谢浪费时间追逐任何东西:)

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

6 个答案:

答案 0 :(得分:54)

你试过这个吗?

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 */

来源:Rounding Number to 2 Decimal Places in C

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

因此,这些舍入值可能不完全是“明显的”十进制值,但它们将非常接近,这是您将获得的最大保证。

答案 1 :(得分:11)

你在Objective-C中的表现与你在C:

中完全相同
double notRounded = ...;
double rounded = round (notRounded * 100.0) / 100.0;

不要使用浮动 - 除非您可以向某人确切地解释您的具体原因是使用浮动超过双倍。 float的精度非常有限。使用ceil或者地板是愚蠢的,因为有一个非常精细的标准功能,名为“圆形”。

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

答案 2 :(得分:5)

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

处理此问题的选项包括:

  • 您可以使用显示“1412.24”的使用格式,而无需更改基础float对象。
  • 您可以使用double靠近(更接近),但它仍然不会完全是1412.24。
  • 您可以将float值缩放为可表示的值(例如,以其他单位衡量,以便您想要的值在float中完全可以表示)。
  • 您可以使用其他数据类型,例如NSDecimal

答案 3 :(得分:3)

此行中的错误

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

将其更正为

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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