質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

3030閲覧

小数を分数で表すには?

manman

総合スコア233

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2016/01/13 10:58

ruby

1irb(main):001:0> a = 1.23456789 2=> 1.23456789 3irb(main):002:0> a.to_r 4=> (5559999489367579/4503599627370496) 5irb(main):003:0> 1.23456789r 6=> (123456789/100000000)

上記において
a から123456789/100000000
を作るにはどうすればいいですか?

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Ruby

1Rational(a.to_s)

とすればできますが、色々と注意点があります。

a = 1.23456789とした時点で、aは十進数の"1.23456789"という値ではありません。Rubyでの1.23456789はFloat型であり二進数の小数点数としてメモリ上に保存されます(RubyのFloat型は、C言語におけるdouble型の実装によりますが、ほとんどの場合はIEEE754倍精度浮動小数点数です)。しかし、二進数の小数点数では1.23456789という十進数をFloat(IEEE754倍精度浮動小数点数)の有効桁数の範囲内で正確に表現する事が出来ないため、近似値に丸められてデータが保存されています。つまり、aは、"1.23456789"という十進数に極めて近いけど、メモリ上のデータとしては異なる値になっているのです。なので、そのままto_rで有理数にしても、十進数とは異なる値になります。

そこで、一旦正確に十進数での"1.23456789"にしてやれば問題は解決です。"to_s"で十進数での文字列に変更した場合、逆に、aの値に近い十進数の値で表現されます。十進数を二進数にしたときと逆の動作が働くのです。こうして元々の十進数での"1.23456789"が得られますので、それをそのまま有理数にすれば同じになると言うことです。

この操作には注意が必要です。Floatが保証できる有効桁数を超えた場合はうまく動作しません。また、演算等を行った後は期待通りに動かない場合があります(例えば、Rational((0.7 - 0.3).to_s)としてみて下さい)。十進数のまま小数を誤差なく正確に計算したい場合は、BigDecimalを使う必要があります。

投稿2016/01/13 12:13

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ではありませんが、関連トピックを。

循環小数 <-> 分数の変換も考えてみることをお勧めします。

1 /3 * 3 = 1 という計算は
Rational(1, 3) * 3 # ==> Rational(1/1)
のようにできますが、
0.33333.... * 3 = 1 ができるようにするのです。

私は その試みをしたことがあります。(複数の言語で)
循環小数は 文字列として "0.{3}" のように表すことにして実装しました。

ruby 版 https://github.com/katoy/ruby_fractional
scala 版 (https://github.com/katoy/scala_rational)[https://github.com/katoy/scala_rational]
nodejs 版 https://github.com/katoy/node-rational

投稿2016/01/13 14:53

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問