我有一个
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说的不同......奇怪。 但是我得到了我想要的东西,所以感谢浪费时间追逐任何东西:)
编辑我很乐意选择你们所有人作为正确的答案,但由于我只能选择一个,我选择了第一个好的答案并附加了解释(最后两个)。
答案 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。它根本无法完成。
处理此问题的选项包括:
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,然后在想要显示最终结果时进行除法。您的数字可能太大而无法禁止此操作。