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

B-M*_*Man 29 floating-point decimal objective-c rounding ios

我有一个

float a = 1412.244019;
Run Code Online (Sandbox Code Playgroud)

我需要一个四舍五入到最接近的第二个小数,如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
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

Luc*_*rdo 59

你试过这个吗?

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 */
Run Code Online (Sandbox Code Playgroud)

来源:C中的舍入数到2个小数位

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

因此,这些舍入值可能不完全是"明显的"十进制值,但它们将非常接近,这是您将拥有的最大保证.


gna*_*729 11

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

double notRounded = ...;
double rounded = round (notRounded * 100.0) / 100.0;
Run Code Online (Sandbox Code Playgroud)

不要使用浮点数 - 除非你可以向某人确切地解释你的具体原因是使用浮点数加倍.float的精度非常有限.使用ceil或者地板是愚蠢的,因为有一个非常精细的标准功能,名为"圆形".

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


小智 6

此行中有错误

a = [[NSString stringWithFormat:@"%.2f", a] floatValue];
Run Code Online (Sandbox Code Playgroud)

改正为

a = [NSString stringWithFormat:@"%.02f", a];
Run Code Online (Sandbox Code Playgroud)


Eri*_*hil 5

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

处理此问题的选项包括:

  • 您可以使用显示"1412.24"的使用格式,而无需更改基础float对象.
  • 你可以使用double更接近(更接近),但它仍然不会完全是1412.24.
  • 您可以float将值缩放为可表示的值(例如,以其他单位进行测量,以便您想要的值都可以准确表示float).
  • 您可以使用其他数据类型,例如NSDecimal.