From: "metanest (Makoto Kishimoto)" Date: 2013-04-25T12:12:31+09:00 Subject: [ruby-dev:47292] [ruby-trunk - Feature #8295] Float や Rational から(可能であれば)正確な BigDecimal を生成する機能 Issue #8295 has been updated by metanest (Makoto Kishimoto). Gist に置いた概念コードでだいたいの考え方を示したつもりなんですが、 BigDecimal に「変換される」側のオブジェクト(たとえばRationalの インスタンス)が、自分が正確に変換できるかどうか判断するという 設計にするのが綺麗かな、という風に考えました。 ---------------------------------------- Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能 https://bugs.ruby-lang.org/issues/8295#change-38884 Author: metanest (Makoto Kishimoto) Status: Assigned Priority: Normal Assignee: mrkn (Kenta Murata) Category: ext Target version: next minor =begin たまに、Float を正確に表現する BigDecimal が欲しいことがあります。 (有効数字の考え方からは邪道ですが。また普通は printf の "%a" による 十六進表現で用が足りることも多いでしょう) 十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に 表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に 限っては、正確に BigDecimal に変換できます。 そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、 正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法 を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、 Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、 そこまで実装してはいません。 基本的なアイディアを実装したコードは (()) にあります。名前などのインタフェースには検討の必要が残っていると思います。 =end -- http://bugs.ruby-lang.org/