2011-07-29 13 views
1

誰でも私に次のことを説明できますか?あなたは同様の振る舞いは一見正しいはずです他の数字のために表示されます目的C - iOS - Strange 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をとり、結果をfloatに戻します。

3

実際、0.04は残りがなく1089.84になります。しかし、それはあなたがコンピュータを実行するように求める計算ではありません。

1089.84と0.04のいずれも浮動小数点数で表現できません。したがって、倍精度リテラルはそれぞれ、最も近い表現可能な値に丸められます。

1089.839999999999918145476840436458587646484375 % 0.040000000000000000832667268468867405317723751068115234375 

0.039999999999895459457111002166129765100777149200439453125 

あなたは結果を印刷するとき、それはディスプレイのためのいくつかの小数点以下第三位を四捨五入している正確である、とあなたが0.04を参照してください。あなたが実際に計算されていることです。