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)
最接近1412.24的值float是1412.239990234375.有没有操作,可以产生一个float比这更接近,因为格式float对象不代表任何更接近的值.要求代表1412.24 float就像要求代表2.5 in int.它根本无法完成.
处理此问题的选项包括:
float对象.double更接近(更接近),但它仍然不会完全是1412.24.float将值缩放为可表示的值(例如,以其他单位进行测量,以便您想要的值都可以准确表示float).NSDecimal.