我认为对NaN进行任何数学运算的结果都应该是NaN,但是 Math.round(Float.NaN) == 0
Math.round() 行为背后的逻辑是什么?
有趣的是,C#的行为不同:http://msdn.microsoft.com/en-us/library/75ks3aby.aspx
我认为对NaN进行任何数学运算的结果都应该是NaN,但是 Math.round(Float.NaN) == 0
Math.round() 行为背后的逻辑是什么?
有趣的是,C#的行为不同:http://msdn.microsoft.com/en-us/library/75ks3aby.aspx
Math.round()
的定义为(long)Math.floor(a + 0.5d)
。
a
是 NaN
,那么 a+0.5d
也是 NaN
。Math.floor()
委托给StrictMath.floor()
,当传入 NaN
时返回 NaN
。NaN
转换为 long
时,返回值为0。所以最终的问题在于为什么将 NaN
转换为 long
会返回0。这个问题已在此问题中得到充分讨论。
哈哈。我想扇自己一个耳光。
Math.round(double)
返回一个long,而long不能是NaN
。替代方案是抛出异常。
在 C# 中,结果仍然是一个double
。
long Math.round(double)
是它的定义方式。这个答案解释了为什么它返回0
而不是NaN
。如果它是double Math.round(double)
,那么C#的方式可能更合适... - user166390long
。 - Ignacio Vazquez-Abrams
Math.round()
时,曾经存在一个错误,它可能会破坏对Math.round()
的未来调用:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4755500 - Hunter McMillenlong
,不能是Double.NaN
,而C#返回double
。 - Peter Lawrey