Project

General

Profile

Feature #8295

Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Added by metanest (Makoto Kishimoto) over 7 years ago. Updated almost 3 years ago.

Status:
Assigned
Priority:
Normal
Target version:
-
[ruby-dev:47271]

Description

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の "%a" による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end


Related issues

Related to Ruby master - Bug #9192: Inconsistent comparison between Float and BigDecimalClosedmrkn (Kenta Murata)Actions

Also available in: Atom PDF