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