我有四舍五入在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
让我知道什么是在这方面和问题,如何解决这个。
我有四舍五入在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
让我知道什么是在这方面和问题,如何解决这个。
问题是,你还没有意识到的浮点固有的问题之一:事实上,大多数数字不能精确表示(A)。
这意味着, 4.845
很可能是,在现实中,像4.8449999999999
里面,当你一轮吧,给你4.84
,而低于预期,什么4.85
。
而你最终也什么样的价值取决于你如何计算它,这就是为什么你得到不同的结果。
而且,当然,没有浮点“不准确”的答案将是不完整的SO没有权威的什么每台计算机科学家应该知道关于浮点运算 。
(a)在一定的类似范围内的两个精确权力只有总和,可以准确地在IEEE754渲染。 因此,例如, 484.5
是
256 + 128 + 64 + 32 + 4 + 0.5
( 2 8 + 2 7 + 2 6 + 2 5 + 2 2 + 2 -1
)。
见这个答案对于更详细的研究进入IEEE754格式。
至于解决它,你有几个选择。 一种是使用double
,而不是float
。 这让你更精确和数量更大的活动范围,但只有移动更远的问题,而不是真正解决它。 由于0.1
是在IEEE754的重复部分, 没有比特量(短无穷大)可以精确地表示它。
另一种选择是使用自定义库就像一个大的十进制类型,它可以表示任意精度小数(这不是无限精度有些人惯于建议,因为它是由内存的限制)。 这将减少由于二进制/十进制失配误差。
您可能还需要寻找到NSDecimalNumber
-这不会给你随心所欲的精度,但它确实给大范围的精确十进制表示。
这里仍然会是你不能代表数字,如PI或2的平方根或任何其他无理数,但它应该包括大多数情况。 如果你真的需要处理的其他值,你需要切换到象征性的数字表示。
不像484.5
它可以准确地为float *表示, 4.845
表示为4.8449998
(见这个计算器 ,如果你想尝试其他数字)。 乘以100保持在数484.49998
,这轮正确至484
。
0.5
是二的幂(即2^-1
)。