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

Duk*_*keh 1 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
Run Code Online (Sandbox Code Playgroud)

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

Ned*_*der 10

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

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

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