2012-04-12 27 views
18

Tôi nghĩ rằng kết quả của bất kỳ phép toán trên NaN nên cung cấp cho tôi một NaN trở lại, nhưng Math.round(Float.NaN) == 0Tại sao Math.round() trả về 0 cho các đối số NaN?

lý do cho hành vi như vậy của Math.round() là gì?

Thật kỳ lạ, C# hoạt động khác: http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

+0

như @pst đã nói, hành vi bình thường của nó được xác định cho NaN: "Nếu đối số là NaN, kết quả là 0". –

+0

Lý do là có một lỗi trong 'Math.round()' khi được gọi trên NaN nó có khả năng hủy hoại các cuộc gọi trong tương lai tới 'Math.round()': http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=4755500 –

+1

Sự khác biệt có thể là; trong Java nó trả về 'long' mà không thể là' Double.NaN' trong khi C# nó trả về một 'double' –

Trả lời

13

Haha. Tôi muốn tự đập mình vào đầu.

Math.round(double) trả về một dàidài không thể NaN. Cách thay thế là một ngoại lệ.

Trong C#, kết quả vẫn là double.

+0

Câu hỏi đặt ra là làm tròn Floats –

+0

@HunterMcMillen Có,' long Math.round (double) 'là cách nó được định nghĩa trong Java. Câu trả lời này giải thích tại sao nó trả về trong '0' và không phải' NaN'. Nếu nó là 'double Math.round (double)' thì cách C# có thể phù hợp hơn ... –

+0

@Hunter: Thao tác * trả về * một 'long'. –

27

Math.round() được định nghĩa là (long)Math.floor(a + 0.5d).

  1. Nếu aNaN, sau đó a+0.5dNaN.
  2. Math.floor() được chuyển hướng đến StrictMath.floor() trả về NaN khi được chuyển vào NaN.
  3. Khi đúc NaN đến một long, nó sẽ trả về 0

Vì vậy, cuối cùng, nó đi xuống đến lý do tại sao đúc NaN đến một long lợi nhuận 0. Vấn đề này đã được thảo luận kỹ lưỡng trong this question.

+0

+1 cho đào vào thực hiện một chút! Có các liên kết đến mã [Mã nguồn mở JDK] cho các chức năng thích hợp? –

+4

+1 Trong Java 7 định nghĩa này đã bị loại bỏ do vấn đề này [Tại sao Math.round (0.499999999999999917) vòng 1 trên Java 6] (http://vanillajava.blogspot.co.uk/2012/04/why-mathround0499999999999999917 -rounds.html) –

Các vấn đề liên quan