2016-10-08 7 views
3

私はdouble値が-0.0dかどうかを判断する方法を見つけようとしています。私は少し問題を探って、いくつかの異なるアプローチを見つけましたが、私が見つけたすべてのスレッドは少なくとも2歳であり、もはや動作しないようです。Java 8で負のゼロをチェックするにはどうすればよいですか?

double x, y; 
x = 0; 
y = -0; 

println(x == y); 
println(Double.compare(x, y) == 0); 
println(new Double(x).equals(new Double(y))); 
println(Double.doubleToLongBits(x) == Double.doubleToLongBits(y)); 
println(Math.signum(x) == Math.signum(y)); 

それらの印刷trueのすべてを、残念ながら:ここ

は、私がこれまで試したものです。

私がユーザ入力からダブル値を解析しようとしていて、例外の場合にはセンチネル値として-0を使用しようとしているので、あなたが疑問に思うなら0と-0を区別する理由があります。 。

+1

"負のゼロ"は実際に意味をなさない。ゼロは肯定的でも否定的でもない。 – David

+2

これはcop-outのように聞こえるかもしれませんが、なぜ入力を 'String'として読み込み、' -0'をチェックし、そうでなければdoubleとして解析するのでしょうか? –

+1

あなたは既に 'Double.doubleToRawLongBits(0.0)== Double.doubleToRawLongBits(-0.0);'を提案しましたか?[here](http://stackoverflow.com/a/14771363/205233)? – Filburt

答えて

16

y = -0.0の代わりにy = -0を使用しているという問題点があります。 0integer literalで、何-0int値はありません、それだけで0のまま、その後widened。あなたも否定する前に拡大を行うために-(double)0を使用して-0.0と同じ結果を得ることができ+0.0dです。

+0

これをテストしただけで、問題を解決できることを確認できます。 –

+0

ありがとう、それは確かに問題でした。 – Axim

+1

はい-0は、整数が負の0を持たないため、ちょうど0になります。-0.0は二重で負の値があります.0.0 +1 –

関連する問題