2011-07-29 59 views
1

任何人都可以帮我解释一下吗?您可以键入相同的编号到谷歌和我的代码正在逐渐得到相同的结果....出现其他数字,貌似应该是正确的Objective C - iOS - 奇怪的fmod()行为

1089.80 % 0.04 = 0 
1089.84 % 0.04 = 0.04 - Surely this is wrong? 0.04 goes into 1089.84 with no remainder. 
1089.88 % 0.04 = 0 
1089.92 % 0.04 = 0 

类似的行为。

在此先感谢!

+1

哦,不要再打电话给我了。 –

+1

非常尴尬,我忘记了浮点精度。我太容易太久了。 – adam

回答

4

您正在查看四舍五入的值。内部数字不是1089.84,而是1089.84000026。

如果你想要“正确”的值,将两边乘以100,加0.5和(int),然后取整数mod,并将结果转换回浮点数。

3

事实上,0.04进入1089.84,没有余数。但是,这不是您要求计算机为您执行的计算。

1089.84和0.04都不能表示为浮点数。因此,每个双精度文字都被舍入到最接近的可表示值。您实际计算是:

1089.839999999999918145476840436458587646484375 % 0.040000000000000000832667268468867405317723751068115234375 

而这恰恰是

0.039999999999895459457111002166129765100777149200439453125 

在打印结果,它被四舍五入到数位小数的显示,所以你看0.04。