PHP でオッズ コンバーターを作成していて、小数オッズを小数オッズに変換するためのこのコードに出くわしました。
function dec2frac($dec) {
$decBase = --$dec;
$div = 1;
do {
$div++;
$dec = $decBase * $div;
} while (intval($dec) != $dec);
if ($dec % $div == 0) {
$dec = $dec / $div;
$div = $div / $div;
}
return $dec.'/'.$div;
}
コードをテストしたところ、計算に成功することもあれば、しばらくの間ページをロードしようとしても失敗することもあったため、何らかの形でループに陥ったと考えました。制限時間を 1 秒に設定し、ループ内にエコーを設定したところ、私の疑いが確認されました。この 2 つのエコーをループに追加して、何が問題なのかを確認しました。
echo "$dec $div<br/>";
echo var_dump(intval($dec) == $dec)." $dec is int<br/>";
10 進数 = 1.6 を使用した失敗時の出力例
1.2 2
bool(false) 1.2 は int
1.8 3
bool(false) 1.8 は int
2.4 4
bool(false) 2.4 は int
3 5
bool(false) 3 は int //ここでブレークして 3/5 を返す必要があります
3.6 6
bool( false) 3.6 は int
4.2 7
bool(false) 4.2 は int
10 進数 = 1.8 を使用した、成功時の出力例
1.6 2
bool(false) 1.6 は int
2.4 3
bool(false) 2.4 は int
3.2 4
bool(false) 3.2 は int
4 5
bool(true) 4 は int
時々整数を認識しないのはなぜですか? 整数が見つかったときにループを終了するように修正するにはどうすればよいですか?