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
对象的格式不代表任何更接近的值。 要求以float
forms表示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];