处理Ruby中的大量(高精度)Floats

时间:2010-08-11 22:17:11

标签: ruby floating-point floating-accuracy

我正在制作一个听定价格定期更新的应用程序,但偶尔我的数据源会抛出类似“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中处理这些数字的任何优雅方法?

3 个答案:

答案 0 :(得分:10)

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

更新:我不确定你明白这个数字是什么意思。 1.79769313486232e + 308是1.79769313486232乘以10到308次幂。它是小数点左边超过300位的数字。这不是一个价格,这是一个错误。它是双精度浮点可以表示的上限。

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

答案 1 :(得分:3)

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

处理这个问题的优雅方法可能是将其视为无限

答案 2 :(得分:0)

你可以使用regexp删除额外的小数

 >> s =~ /\.\d\d\d(\d+)/
 >> s.gsub($1, '')
 => "1.797e+308"