19

NaN に対する数値演算の結果は NaN を返すはずだと思っていましたが、Math.round(Float.NaN) == 0

Math.round()のこのような動作の根拠は何ですか?

興味深いことに、C# の動作は異なります: http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

4

2 に答える 2

27

Math.round()として定義され(long)Math.floor(a + 0.5d)ます。

  1. である場合aはです。NaNa+0.5dNaN
  2. Math.floor()に渡されたときにStrictMath.floor()返されるに委譲されます。NaNNaN
  3. にキャストNaNすると、long0 が返されます

したがって、最終的には、NaNa へのキャストが 0 を返す理由に行き着きます。この問題は、この質問longで徹底的に議論されています。

于 2012-04-12T04:01:07.340 に答える
14

ハハ。頭を殴りたい。

Math.round(double)はlongを返しますが、longを にすることはできません。代替は例外です。NaN

C# では、結果は依然としてdouble.

于 2012-04-12T03:58:11.400 に答える