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

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

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

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

Q&A

解決済

2回答

1407閲覧

Ruby で小数点のある基数変換

yukihide1188

総合スコア44

Ruby

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

0グッド

0クリップ

投稿2021/07/11 07:59

実現したいこと

Rubyで、小数点のある数値の基数変換が可能なメソッドなどはありますか?

【2進数】1101.011 => 【10進数】13.375
【10進数】13.375 => 【2進数】1101.011
【2進数】1101.01 => 【8進数】15.2

試したこと

整数であれば、to_sto_iを使用して基数変換ができたのですが、

ruby

1# 2進数 => 10進数 2'1101'.to_i(2) # => 13 3 4# 10進数 => 2進数 513.to_s(2) # => "1101" 6 7# 2進数 => 8進数 8'1101'.to_i(2).to_s(8) # => "15"

to_iは小数点以下を切り捨ててしまうため上手くいかず、

ruby

1# 2進数 => 10進数 2'1101.011'.to_i(2) # => 13

to_sではエラーになってしまいます。

ruby

113.375.to_s(2) # => ArgumentError (wrong number of arguments (given 1, expected 0))

FloatBigDecimalにあるかと考え、調べてみたのですが、それらしいものを見つけることができませんでした。

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

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

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

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

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

guest

回答2

0

小数fに対してn進数m桁の小数部の整数列sの場合、分数形式に変換するとs.to_i(n) / n**mになります。
例: 10進数の0.029 = "029".to_i(10) / 10 ** 3 = 29 / 1000
2進数の0.11 = "11".to_i(2) / 2**2 = 3/4
3進数の0.1 = ... = 1/3

これをnd進数md桁に変換するためには
s.to_i(n) / n**m = X / nd**md
X = (s.to_i(n) / n**m) * nd**md

あとはXの整数部を小数点以下に右詰め0埋めにしてやればいい

投稿2021/07/12 17:01

編集2021/07/12 17:06
asm

総合スコア15149

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

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

yukihide1188

2021/07/13 13:00

このような考え方もあるのですね。 丁寧にありがとうございました。
guest

0

ベストアンサー

整数部分と小数部分とに分けて文字列を作り、合成することになります。
整数部分は既存のキャストメソッドでよいでしょう。
小数部分は、自分で基数倍を繰り返して目的の文字列を作る自作関数を作ることになるでしょう。
最近terarailで軽く炎上した、小数の基数変換のアルゴリズムを教えてください。の回答が参考になります。

投稿2021/07/11 10:13

編集2021/07/12 11:38
seastar3

総合スコア2287

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

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

yukihide1188

2021/07/12 09:12

やっぱり、小数部のメソッドはないのですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問