我使用命令1.012
使用Javascript将浮点数1.012.toString(16)
转换为十六进制,现在可以将javascript 1.03126e978d4fe
的输出反转为{{1}使用Ruby?
简而言之,反转在Ruby中编码为十六进制的浮点的最简单方法是什么?
感谢。
答案 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