技術情報システム内部で数値を分数で扱っているものがあり、一部の計算でどうしても実数を分数に変換しなければならないケースがあったため、実数を分数にするアルゴリズムが無いか考えてみました。簡単な方法は、小数桁数nの10のべき乗(10^n)を分母にする方法ですが、桁数の少ない有限小数(0.125とか)ならきれいに分数に変換できます。分母とする値に限界があるため、桁数の多い有限小数や無限小数の場合は、足切りした桁数で誤差が発生してしまいます。Double)で扱うことが多いので、指数部と仮数部から求めた小数を表すビット数nの2のべき乗(2^n)を分母とし、浮動小数点で表せる範囲で精度を高める方法も考えましたが、浮動小数点で正確に表せない実数(0.1など)がうまく表せなくなる問題があります。実数を分数にするためには、実数に何を掛ければ整数となるかの最小値を求めます。計算のように、分子と分母に掛けた値「2」が求まれば良いことになります。1.25と求めた値が実数となる場合があります。求めた値を整数にするため、同様の計算を繰り返すことで、実数を整数とする値を求めることができます。5ちなみに、計算過程(無限小数)で誤差が含まれることがあるため、求めた値に小数がなくなったことが正しく判断できない場合あります。このため、求められた結果が実数と一致するかで処理の終了を判断します。10上記の処理を組み込んだ分数型(Fraction構造体)を.NETのクラスライブラリにて公開していますので、試してみたい方はこちらからダウンロードしてください。