Подтвердить что ты не робот

Почему Math.round() возвращает 0 для аргументов NaN?

Я думал, что результат любой математической операции над NaN должен дать мне NaN назад, но Math.round(Float.NaN) == 0

В чем обоснование такого поведения Math.round()?

Любопытно, что С# ведет себя по-другому: http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

4b9b3361

Ответ 1

Ха-ха. Я хочу ударить себя в голову.

Math.round(double) возвращает long и long не может быть NaN. Альтернативой является исключение.

В С# результат все равно a double.

Ответ 2

Math.round() определяется как (long)Math.floor(a + 0.5d).

  • Если a - NaN, то a+0.5d - NaN.
  • Math.floor() delagated to StrictMath.floor(), который возвращает NaN при передаче в NaN.
  • При нажатии NaN на long он возвращает 0

Итак, в конце концов, дело в том, почему приведение NaN в long возвращает 0. Эта проблема была подробно обсуждена в этом вопросе.