【问题标题】:Convert a floating point hexadecimal to float in Ruby将浮点十六进制转换为 Ruby 中的浮点数
【发布时间】:2017-01-29 17:46:36
【问题描述】:

我使用 Javascript 使用命令 1.012.toString(16) 将浮点数说 1.012 转换为十六进制,现在可以做些什么来使用 Ruby 将 javascript 1.03126e978d4fe 的输出反转为 1.012

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

谢谢。

【问题讨论】:

  • “十六进制”和“浮点数”在同一个句子中没有任何关系。该输出完全是疯狂的。
  • @tadman : 一开始我也很困惑。不过这确实是有道理的,并且与我们的十进制浮点数一致。

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


【解决方案1】:

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

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

【讨论】:

  • 为什么Integer 带有所有这些字符串hackery 而不是.to_i(16)
  • 啊哈。我什至不明白这个问题,我不明白答案,但显然,你解决了它。
  • i.to_i 应该是 i.to_i(16)Float(32) 编码为20.0
  • 你的方法可以写成i.to_i(16) + m.to_i(16).to_f/16**m.lengthBTW。
  • 16**m 是一种方式。 1<<(4*m) 是另一个,其中任何一个都比重新以0x1 为前缀的字符串然后将其转换为整数要好。
【解决方案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

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 2010-12-08
    • 2016-06-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多