为什么Math.round()为NaN参数返回0?

时间:2012-04-12 03:52:20

标签: java floating-point nan

我认为对NaN进行任何数学运算的结果都应该给我一个NaN,但是Math.round(Float.NaN) == 0

Math.round()这种行为的理由是什么?

奇怪的是,C#的行为有所不同:http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

2 个答案:

答案 0 :(得分:28)

Math.round()定义为(long)Math.floor(a + 0.5d)

  1. 如果aNaN,则a+0.5dNaN
  2. Math.floor()发布为StrictMath.floor(),在NaN传递时会返回NaN
  3. NaN投射到long时,会返回0
  4. 最终,归结为为什么将NaN转换为long会返回0.此问题已在this question中进行了详细讨论。

答案 1 :(得分:14)

哈哈。我想把自己砸在头上。

Math.round(double)返回 long long 不能NaN。替代方案是例外。

在C#中,结果仍为double