0

一連の計算を実行しているシステムがあり、何らかの理由で、0.07 が表示されるたびに 0.07000000000000001 と表示されます

浮動小数点数が近似値であることは十分承知していますが、次のようなコードを書いています。

number = '%.2f' % ( num1 - num2 )
number.to_f

それにもかかわらず、 0.07000000000000001 がコードに表示され続け、最終的に配列の並べ替えが失敗します。

sort! { |a,b| b <=> a }      <-- b equals 0.07000000000000001 and a equals 0.08

これらの 2 つの数値を比較できないというエラーが発生します。これを修正する方法について何か考えはありますか?

アップデート

したがって、元の値が 0.07351923338974675 であるかのように見え、その時点で .round(2) を呼び出します。次に、Redis に一時的に保存してから、引き出します。計算を実行すると、最終的に 0.07000000000000001 と表示されます。別の解決策がない限り、ここでは整数比較が最適なように思えます。

4

1 に答える 1

2

すべての数値は順序付けされていますが、文字列は数値に対して順序付けられた比較を行うことはできず、それらが同じオブジェクトであるかどうかを確認するための等値比較のみを行うことができます。(明らかに、常に false を返す比較です。)

これは、次のようなタイプのエラーであると思います: ArgumentError: comparison of String with Float failed

Float オブジェクトの下位ビットの問題は、ソートに干渉する可能性がありますが、実際に例外が発生する可能性は非常に低いようです。ほとんどの 10 進文字列分数と同様0.07に、基礎となる Float 形式では正確な表現がありません。0.07(リテラル定数と計算結果)に到達する方法が異なると、わずかに異なる値になる可能性があります。

ただし、実際の数量よりも多くの小数部の桁を印刷しようとすると、そこにあった最後のビットのさまざまな残りが表示されることに注意してください。これらの数字はゼロ以外でもかまいませんが、番号について有益なことは何もわかりません。

最も安全なのは、整数値にスケーリングし#to_i,、整数を呼び出して比較することです。

于 2013-02-01T23:18:04.203 に答える