2012-04-12 15 views
18

मैंने सोचा था कि एक NaN पर किसी भी गणितीय आपरेशन के परिणाम है कि मुझे एक NaN वापस देना चाहिए, लेकिन Math.round(Float.NaN) == 0Math.round() NaN तर्कों के लिए 0 क्यों लौटाता है?

Math.round() के इस तरह के व्यवहार के लिए तर्क क्या है?

मजे की बात है, सी # अलग ढंग से व्यवहार करती है: http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

+0

@pst के रूप में कहा गया है, इसका सामान्य व्यवहार NaN के लिए परिभाषित किया गया है: "यदि तर्क NaN है, तो परिणाम 0 है"। –

+0

तर्क यह है कि NaN पर कॉल किए जाने पर 'Math.round()' में एक बग होता था, यह संभावित रूप से 'Math.round() ': http://bugs.sun.com/bugdatabase/ पर भविष्य की कॉल को बर्बाद कर सकता है: view_bug.do?bug_id=4755500 –

+1

अंतर होने की संभावना है; जावा में यह 'लम्बा' देता है जो 'डबल एनएएन' नहीं हो सकता है जबकि सी # यह एक 'डबल' –

उत्तर

13

Haha। मैं खुद को सिर में स्मैक करना चाहता हूं।

Math.round(double) एक लंबे और एक लंबेNaN नहीं किया जा सकता देता है। विकल्प एक अपवाद है।

सी # में परिणाम अभी भी double है।

+0

लौटाता है। प्रश्न फ्लोट्स –

+0

@HunterMcMillen हां, 'लंबा Math.round (डबल)' के बारे में है, यह कैसे परिभाषित किया गया है जावा में यह जवाब बताता है कि यह '0' में क्यों लौटाता है और 'NaN' नहीं। यदि यह 'डबल Math.round (डबल) 'था तो सी # रास्ता अधिक उपयुक्त हो सकता है ... –

+0

@Hunter: ऑपरेशन * रिटर्न * एक' लंबा'। –

27

Math.round() को (long)Math.floor(a + 0.5d) के रूप में परिभाषित किया गया है।

  1. तो aNaN, a+0.5dNaN है तो।
  2. Math.floor()StrictMath.floor() पर अस्वीकृत है जो NaN पर NaN पर लौटाता है।
  3. जब एक long को NaN कास्टिंग, यह रिटर्न 0

तो अंत में, यह क्यों एक long रिटर्न 0. यह समस्या पूरी तरह this question में चर्चा की गई है करने के लिए NaN कास्टिंग के लिए नीचे आता है।

+0

+1 कार्यान्वयन में खुदाई के लिए +1! उचित कार्यों के लिए [ओपन सोर्स जेडीके] कोड के लिंक हैं? –

+4

+1 जावा में 7 इस परिभाषा को इस मुद्दे के कारण गिरा दिया गया है [क्यों मैथ.राउंड (0.4 99 99 99 99 99 99 99917) जावा 6 पर राउंड 1 तक) (http://vanillajava.blogspot.co.uk/2012/04/why-mathround0499999999999999917 -rounds.html) –