在Ruby中将浮点十六进制转换为浮点数

时间:2017-01-29 17:46:37

标签: javascript ruby ruby-on-rails-4

我使用命令1.012使用Javascript将浮点数1.012.toString(16)转换为十六进制,现在可以将javascript 1.03126e978d4fe的输出反转为{{1}使用Ruby?

简而言之,反转在Ruby中编码为十六进制的浮点的最简单方法是什么?

感谢。

2 个答案:

答案 0 :(得分:4)

这是我见过的最奇怪的转换。

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

答案 1 :(得分:2)

这个输出一开始看起来很奇怪,但它实际上与我们的十个浮点数一致。 1.012看起来很正常,因为我们每天都使用十进制数字系统。

如果我理解正确,输出可以看作是一个有理数,分子是整数十六进制数(没有'。'),分母是16**(length of "decimal" part)

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

如果您只需要转换十六进制浮点数,则可以删除base参数:

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