0
等しくない:私のプログラムによって作成された値が、残念ながら最初の1である私の場合は2つの非常に近い浮動小数点数は、IRBで
0.9999999999999998
# => 0.9999999999999998
0.99999999999999998
# => 1.0
:
0.9999999999999998 == 1.0
# => false
0.99999999999999998 == 1.0
# => true
もちょうどinspect
値を示します、私は値が1に等しいことを検証するテストケースを書くのに問題があります。
私は、次のオプションの間で決定しています:
- は、アプリケーションコードで
round
呼び出しを追加、しかし、アプリケーションが既に働いている、私はちょうど - は、テストコード に
- ???
round
の呼び出しを追加し、テストすることができません
お勧めのアプローチは何ですか? 10進数の後に15を0にして1.0を扱うようにプログラムを構成する方法はありますか?小数点以下16桁が切り捨てられているように思えるので、ちょっとイライラします。小さな浮動小数点の違いを比較する方法については、この記事読ん
IRBは、任意の精度を持つBigDecimal型ではなく、固定精度を持つFloat型として10進浮動小数点値を解釈していることがわかりました。それはあなたのプログラムが何をすべきか、あるいは何をすべきか、あるいはあなたのテストが何をするべきか、何をすべきかについてほとんど言及していません。 –
浮動小数点数の等価比較を厳密に(in)実行することはめったに適切ではないことにも注意してください。任意精度の数値を使用しても、それは実際には変更されません。特定のアドバイスが必要な場合は、テストする述部が何であるかを明確にする必要があります。 –
@JohnBollinger私は '0.9999999999999998 == 1.0'のような方法でフロートを設定する方法があるのだろうかと思います。私が言ったように、この値(15ナインズ)は、必要とする精度(16ナイン)から1つだけ離れているようです。私は[Float](https://ruby-doc.org/core-2.2.3/Float.html)クラスの定数を見始めました。私は 'EPSILON'と' DIG'を変更しようとしましたが、効果がありません。 –