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

21

正如@pst所说,这是NaN的正常行为定义:“如果参数是NaN,则结果为0”。 - Luiggi Mendoza
这样做的原因是,当在NaN上调用Math.round()时,曾经存在一个错误,它可能会破坏对Math.round()的未来调用:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4755500 - Hunter McMillen
2
区别可能在于:Java返回long,不能是Double.NaN,而C#返回double - Peter Lawrey
2个回答

28

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

  1. 如果 aNaN,那么 a+0.5d 也是 NaN
  2. Math.floor() 委托给StrictMath.floor() ,当传入 NaN 时返回 NaN
  3. NaN 转换为 long 时,返回值为0。

所以最终的问题在于为什么将 NaN 转换为 long 会返回0。这个问题已在此问题中得到充分讨论。


+1 为深入了解实现而加分!是否有适当函数的[开源JDK]代码链接? - user166390
6
在Java 7中,由于为什么Math.round(0.499999999999999917)在Java 6中四舍五入为1这个问题,该定义已被删除。 - Peter Lawrey

15

哈哈。我想扇自己一个耳光。

Math.round(double)返回一个long,而long不能是NaN。替代方案是抛出异常。

在 C# 中,结果仍然是一个double


问题是关于浮点数的四舍五入。 - Hunter McMillen
1
@HunterMcMillen 是的,在Java中,long Math.round(double)是它的定义方式。这个答案解释了为什么它返回0而不是NaN。如果它是double Math.round(double),那么C#的方式可能更合适... - user166390
@Hunter:该操作返回一个long - Ignacio Vazquez-Abrams
哈哈,有趣(有点悲哀)。该死的自动装箱(让我困惑了)。 - MK.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接