1

我正在制作一个应用程序,它正在监听定期更新的价格,但偶尔我的数据源会向我抛出类似“1.79769313486232e+308”的信息。发送的数字永远不会是非常大的数字(例如“179769313486232e+308”),但与上面的示例一样,它们具有很高的精度。

我很乐意删除前几个小数位之后的所有内容,最终得到类似“1.798”的内容,但以下代码对我不起作用:

irb(main):001:0> s = '1.79769313486232e+308'
=> "1.79769313486232e+308"
irb(main):002:0> ("%.3f" % s).to_f
(irb):2: warning: Float 1.79769313486232e+30... out of range
=> 0.0

在 Ruby 中处理这些数字的任何优雅方法?

4

3 回答 3

10

您需要从数据源中找出这些真正大的数字意味着什么。价格实际上不是 1.797e+308,但也可能不是 1.797。您如何处理这些数字完全取决于您应该将它们解释为什么值。

更新:我不确定你是否理解这个数字的含义。1.79769313486232e+308 是 1.79769313486232 乘以 10 的 308 次方。它是一个小数点左侧超过 300 位的数字。这不是价格,这是一个错误。它是双精度浮点可以表示的上限。

换句话说,你得到的相当于 0xFFFFFFFF 或类似的东西,但被解释为浮点数。

于 2010-08-11T22:59:49.623 回答
3

这正好在“双打”范围的顶部。例如,在 Python 中,它被转换为称为“inf”的特殊浮点数。

处理这个问题的优雅方式可能是将其视为无穷大

于 2010-08-11T22:38:34.310 回答
0

您可以使用正则表达式去除多余的小数

 >> s =~ /\.\d\d\d(\d+)/
 >> s.gsub($1, '')
 => "1.797e+308"
于 2010-08-11T22:53:49.447 回答