2017-01-29 13 views
2

に浮遊する浮動小数点の16進数に変換し、私は、浮動小数点数を変換するコマンド1.012.toString(16)を使って、Javascriptを使用して16進数の1.012を言うと、今のRubyを使用して1.012するためにJavaScript 1.03126e978d4feの出力を反転させるために何ができるのか?はルビー

要するに、Rubyで16進数としてエンコードされた浮動小数点を逆転する最も簡単な方法は何ですか?

ありがとうございました。

+0

「進」と「フロート」を何のビジネスは同じ文にあるんです。その出力は完全に嫌なことです。 – tadman

+0

@tadman:私は最初も本当に困惑していました。しかし、それは意味をなさないし、私たちのベースのフロートと一致しています。 –

答えて

2

この出力は、最初は本当に奇妙に見えましたが、実際にはベースの10個のフロートと一致しています。 1.012は、私たちが毎日10進数字システムを使用しているからといって、普通に見えます。

def string_to_float(string, base = 10) 
    string.delete('.').to_i(base).to_f/base**(string.reverse.index('.') || 0) 
end 

string_to_float('1.03126e978d4fe', 16) 
#=> 1.012 

string_to_float('1c.8', 16) 
#=> 28.5 

string_to_float('3.243f6a8885a3', 16) 
#=> 3.141592653589793 

string_to_float('20.0', 16) 
#=> 32.0 

string_to_float('20.', 16) 
#=> 32.0 

string_to_float('20', 16) 
#=> 32.0 

string_to_float('3.14159', 10) 
#=> 3.14159 

string_to_float('11.001001000011111101101010100010001000010110100011', 2) 
#=> 3.141592653589793 

あなただけに必要な場合:私はそれを正しく理解していれば

は、出力は、分子は(「」なし)全体進数であると分母が16**(length of "decimal" part)であると合理的とみなすことができます進浮動小数点数を変換し、あなたがbase引数を削除することができます

def hex_string_to_float(hex) 
    hex.delete('.').to_i(16).to_f/16**(hex.reverse.index('.') || 0) 
end 
4

これは私が今までに見た変わった変換です。

i, m = "1.03126e978d4fe".split('.') 
Integer("0x#{i}") + 1.0 * Integer("0x#{m}")/Integer("0x1#{'0' * m.length}") 
#⇒ 1.012 
+0

'.to_i(16)'ではなく、文字列のハッカーで 'Integer'となるのはなぜですか? – tadman

+1

ああ。私は質問を理解していない、私は答えを理解していないが、明らかに、あなたはそれを解決した。 –

+1

'i.to_i'は' i.to_i(16) 'でなければなりません。 'Float(32)'は '20.0'としてエンコードされます。 –