このコードは現在正常に動作していますが、すべてのケースで正解を返しますか?2つのdouble値のモジュロをJavaの整数と比較するのは正しいですか?
double val1 = 0.75;
double val2 = 0.25;
if(val1 % val2 == 0){
// do something
}
このコードは現在正常に動作していますが、すべてのケースで正解を返しますか?2つのdouble値のモジュロをJavaの整数と比較するのは正しいですか?
double val1 = 0.75;
double val2 = 0.25;
if(val1 % val2 == 0){
// do something
}
、あなたは小さな値ではなく整数とそれを比較する必要があり、その理由は次のとおりです。1.0 and 0.1
:
が2つの値を考えてみましょう。 1.0 % 0.1
を実行すると、丸め誤差の結果として0.09999999999999995
と表示されます。 Integerと比較すると、falseが返されます。
@MauricePerryの回答に記載されているように、以下がベストプラクティスです。
Math.abs(val1 % val2) < EPSILON //where EPSILON is a small value
私はそれをしないだろう:
は、ここに私のコードでこれらの値のために、結果が正しいかもしれないが、おそらくないと、0.6と0.2を言います。
UPDATEところで
:(0)比較の前に、二重に変換されますと、あなたがモジュロを比較している整数。他の回答で述べたように
私はいつもモジュロを0.25とします。 –
@AnkurLathiya私はそれをしません。 –
もっと良いものを" if(val1%val2 == 0) "とすればいいですか? –
はい!
%,
モジュラスまたは残余演算子としても知られています。 %演算子は、2つの数値の残りの部分を返します。例えば、10%3は1を3で割った値が1の剰余を残すため1です。
これは条件によって異なります。 isCompeletlyを割り切れるかどうかチェックしたい場合は、ゼロをチェックする必要があります。 – Mritunjay
私はあなたが "数学的に正しい"と考えるものを知らない。 Java言語仕様の[セクション15.17.3](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.3)では、 '% '演算子が計算します。それを読んで、それがあなたが期待することをすればあなた自身のために決めてください。 – Jesper
@Jesper question edited、私は、3.9%0.1が間違った答えを与えることを発見したので、すべての場合に正解を与えることを意味します。 –