剰余演算した時の結果が正しく得られません
剰余演算した時の結果が正しく得られない時があります。
例えば 1020 を 100 で割った余りは 20 です。
これが 19 になる時があるのですが原因がわかりません。
正確には 10.20 を 100 倍したものを 100 で割った余りなのですが、
いずれにしても結果は 20 が正しいはずです。
調査のためにプログラムを作成してみました。
ア:1020÷100の余りを表示
イ:10.20×100÷100の余りを表示
ウ:増分値毎の余りを表示
<?php
//ア:1020÷100の余りを表示
echo "ア:",1020%100,"<br>";
//イ:10.20×100÷100の余りを表示
echo "イ:",10.20*100%100,"<br>";
//ウ:増分値毎の余りを表示
$a=array(0.05,0.10,0.01,0.02,0.04);
foreach($a as $aa){
echo "増分値:$aa<br>";
for ($i=10.00;$i<=10.30;$i=$i+$aa){
$j=$i*100;
$k=$j%100;
echo "$i,$j,$k<br>";
}
}
?>
結果は以下のようになりました。
ア:20
イ:19
増分値:0.05
10,1000,0
10.05,1005,5
10.1,1010,10
10.15,1015,15
10.2,1020,20
10.25,1025,25
増分値:0.1
10,1000,0
10.1,1010,10
10.2,1020,19
10.3,1030,30
増分値:0.01
10,1000,0
10.01,1001,1
10.02,1002,2
10.03,1003,2
10.04,1004,3
10.05,1005,4
10.06,1006,5
10.07,1007,6
10.08,1008,7
10.09,1009,8
10.1,1010,9
10.11,1011,10
10.12,1012,11
10.13,1013,12
10.14,1014,13
10.15,1015,14
10.16,1016,15
10.17,1017,16
10.18,1018,17
10.19,1019,18
10.2,1020,19
10.21,1021,20
10.22,1022,21
10.23,1023,22
10.24,1024,23
10.25,1025,24
10.26,1026,25
10.27,1027,26
10.28,1028,27
10.29,1029,28
10.3,1030,29
増分値:0.02
10,1000,0
10.02,1002,2
10.04,1004,3
10.06,1006,5
10.08,1008,7
10.1,1010,9
10.12,1012,11
10.14,1014,13
10.16,1016,15
10.18,1018,17
10.2,1020,19
10.22,1022,21
10.24,1024,23
10.26,1026,25
10.28,1028,27
10.3,1030,29
増分値:0.04
10,1000,0
10.04,1004,3
10.08,1008,7
10.12,1012,11
10.16,1016,15
10.2,1020,19
10.24,1024,23
10.28,1028,27
アは正しいのですが、イは正しくありません。
増分値:0.05の時はすべて正しく、
増分値:0.1の時は 1020 の時だけ 19 で正しくありません。
他の増分値では 1003 以降が正しくありません。
ア、イの結果の違いも不思議ですが、
増分値:0.01,0.02,0.04の時が 1003 以降がすべて正しくないのに、
増分値:0.1の時は 1020 以降ではなく 1020 のみなのも不思議です。
PHPのバージョンは「5.2.5」と「4.4.8」で動作確認しましたが、
どちらも同じ結果でした。
小数値を整数になるよう位上げしたものの剰余演算は、
こうなってしまうものなのでしょうか。
もともとの話は、
「10時20分」と言う時刻データが「10.20」と記録されていて、
分の部分を取り出すために100倍して100の剰余を求めていたところ、
結果が「19」になるので気づきました。
しかも、この現象が発生するのは、
「8.03」「8.04」「8.20」「9.03」「9.04」「9.20」
「10.03」「10.04」「10.20」だけで、
他の時刻(他の時、他の分)では発生しません。
全部の時刻で調べてはいませんが、
7時以前や11時以降でのこれら共通の分では正しい結果がでます。
調査プログラムの増分値では「10.03」以降が正しくなかったりしますが、
もともとの話のデータでは「10.05」は正しいのです。
これには何かわけがあるのでしょうか。
また、正確な剰余、あるいは、この場合の「分」を求める方法がありましたら、
何かしらのアドバイスをいただきたく思います。
よろしくお願いします。