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」と呼ばれる特別な float に変換されます。

これを処理する優雅な方法は、それを無限として扱うことかもしれません

于 2010-08-11T22:38:34.310 に答える
0

regexp を使用して余分な小数を取り除くことができます

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