剰余演算した時の結果が正しく得られません
剰余演算した時の結果が正しく得られない時があります。
例えば 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」は正しいのです。
これには何かわけがあるのでしょうか。
また、正確な剰余、あるいは、この場合の「分」を求める方法がありましたら、
何かしらのアドバイスをいただきたく思います。
よろしくお願いします。
お礼
ご回答ありがとうございます。 書き方が少し拙かったようですね。 「オンニ」は存じております。 同い年や年下など、いわゆる「タメ語」で話せる人をどのように 呼んだらいいのか知りたかったのですが、とてもよく分かりました。 どうもありがとうございました。