Rubyのsleepメソッドの戻り値が不思議。
プログラミング講座のテキストを作っていた時の出来事です。sleepメソッドの項目に来たので、どうやって書こうかなとググってみたら。。。
sleepメソッドは、休んだ時間数の整数が戻り値として返ってくる
と知りました。
モジュール:Kernel > クエリ:sleep | るりまサーチ
整数って事は、小数は四捨五入されるのかな?と思い調べてみました。
調べ方
途中経過
四捨五入だとしたら、sleep 1.5
は2
になるのかと思いきや、突然裏切られました。
> sleep 1.5
=> 1
でも、
> sleep 1.6
=> 2
あれ・・・?
じゃあ、1.5
のどこかに分かれ目があるはず!
と思い、ちょこっとずつ数字を変えてみました。
そして、1.566741
あたりまで行った時、異変に気づきました。
> sleep 1.566741
=> 1
> sleep 1.566741
=> 2
いままで、2回以上検証しなかった自分の甘さに落胆しました。
もしかしてと思って、何回も試していると規則性があったので検証してみます。
規則性の検証
上記のコードを使用。
how_long_sleep?
メソッドに小数time
を渡す。sleep time
の戻り値を取得。- 戻り値と
time.to_i
が等しい数just
をカウント。 - 100回繰り返して
just
がいくつになったか返す。
検証結果
time | just | time | just | time | just | ||
---|---|---|---|---|---|---|---|
0 | 100 | 0 | 100 | 1 | 100 | ||
0.0 | 100 | 0.0 | 100 | 1.0 | 100 | ||
0.01 | 99 | 0.1 | 90 | 1.1 | 90 | ||
0.02 | 98 | 0.2 | 80 | 1.2 | 80 | ||
0.03 | 97 | 0.3 | 70 | 1.3 | 70 | ||
0.04 | 96 | 0.4 | 60 | 1.4 | 60 | ||
0.05 | 95 | 0.5 | 50 | 1.5 | 50 | ||
0.06 | 94 | 0.6 | 40 | 1.6 | 40 | ||
0.07 | 93 | 0.7 | 30 | 1.7 | 30 | ||
0.08 | 92 | 0.8 | 20 | 1.8 | 20 | ||
0.09 | 91 | 0.9 | 10 | 1.9 | 10 |
表が見辛い。。。(-"-;)
1秒台の検証でもsleep時間が100秒超えてしまうので、続きはあきらめました。
こういう規則性をなんというのでしたっけ。
忘れてしまいました。
グラフにするとこうでした。
just = 100 - timeの小数 * 100
と言う感じでしょうか。仕様なのかな?これ。