iOS版 - 用四舍五入一个roundf浮动()无法正常工作(iOS - rounding a fl

2019-08-17 15:40发布

我有四舍五入在iPhone应用程序中漂浮的问题。

float f=4.845;
float s= roundf(f * 100.0)/100;
    NSLog(@"Output-1: %.2f",s);
      s= roundf(484.5)/100;
    NSLog(@"Output-2: %.2f",s);

Output-1: 4.84
Output-2: 4.85

让我知道什么是在这方面和问题,如何解决这个。

Answer 1:

问题是,你还没有意识到的浮点固有的问题之一:事实上,大多数数字不能精确表示(A)。

这意味着, 4.845很可能是,在现实中,像4.8449999999999里面,当你一轮吧,给你4.84 ,而低于预期,什么4.85

而你最终也什么样的价值取决于你如何计算它,这就是为什么你得到不同的结果。

而且,当然,没有浮点“不准确”的答案将是不完整的SO没有权威的什么每台计算机科学家应该知道关于浮点运算 。


(a)在一定的类似范围内的两个精确权力只有总和,可以准确地在IEEE754渲染。 因此,例如, 484.5

256 + 128 + 64 + 32 + 4 + 0.52 8 + 2 7 + 2 6 + 2 5 + 2 2 + 2 -1 )。

见这个答案对于更详细的研究进入IEEE754格式。


至于解决它,你有几个选择。 一种是使用double ,而不是float 。 这让你更精确和数量更大的活动范围,但只有移动更远的问题,而不是真正解决它。 由于0.1是在IEEE754的重复部分, 没有比特量(短无穷大)可以精确地表示它。

另一种选择是使用自定义库就像一个大的十进制类型,它可以表示任意精度小数(这不是无限精度有些人惯于建议,因为它是由内存的限制)。 这将减少由于二进制/十进制失配误差。

您可能还需要寻找到NSDecimalNumber -这不会给你随心所欲的精度,但它确实给大范围的精确十进制表示。

这里仍然会是你不能代表数字,如PI或2的平方根或任何其他无理数,但它应该包括大多数情况。 如果你真的需要处理的其他值,你需要切换到象征性的数字表示。



Answer 2:

不像484.5它可以准确地为float *表示, 4.845表示为4.8449998 (见这个计算器 ,如果你想尝试其他数字)。 乘以100保持在数484.49998 ,这轮正确至484


*一个精确的表示是可能的,因为其小数部分0.5是二的幂(即2^-1 )。



文章来源: iOS - rounding a float with roundf() is not working properly