1/3 や 1/7 のような循環小数を数値型を使って表現しようとすると、普通は有効桁数の範囲でしか表記できない。そうではなく、次のように循環小数であることが一目瞭然となってほしい。
1 / 3 = 0.(3)
1 / 7 = 0.(142857)
そこで単純に、分子と分母を引数に受け取り、上のような文字列を返すアルゴリズムを書いた。それが以下。
https://gist.github.com/sato11/36abbaa4b43b26f01ef5d100dec321e8
筆算で除算を解くのと同じ要領で、桁ごとに除算の余りを10倍してはさらに除数で割っていく、というループを作っている。ループの最中に余りが0となればその数は明らかに循環小数ではない。他方で循環小数については、各桁の除算で得られた余りを記録しておいて、同じ余りが現れたらその時点で循環とみなしている。数値型ではなく文字列だから、有効桁数に制限もない。
to_rational(1, 3) // => 0.(3)
to_rational(1, 7) // => 0.(142857)
to_rational(1, 23) // => 0.(0434782608695652173913)
to_rational(727, 53) // => 13.(7169811320754)