2011-09-02 14 views
64

जब मैं Math.ceil(5.2) पर कॉल करता हूं तो वापसी double6.0 है। मेरा प्राकृतिक झुकाव यह सोचना था कि Math.ceil(double a)long लौटाएगा।Math.ceil एक डबल वापस क्यों करता है?

ceil(double a)

रिटर्न छोटी (नकारात्मक अनंत को निकटतम) double मूल्य कि तर्क से कम नहीं है और एक गणितीय पूर्णांक के बराबर है: प्रलेखन से।

लेकिन long के बजाय double वापस क्यों परिणाम एक पूर्णांक है? मुझे लगता है कि इसके पीछे कारण समझने से मुझे जावा को थोड़ा बेहतर समझने में मदद मिल सकती है। यह मुझे यह जानने में भी मदद कर सकता है कि क्या मुझे long पर कास्ट करके परेशानी हो जाएगी, उदा।

long b = (long)Math.ceil(a);

हमेशा

है कि मैं क्या लगता है कि यह होना चाहिए? मुझे डर है कि कुछ सीमा मामले हो सकते हैं जो समस्याग्रस्त हैं।

+0

देखें http://stackoverflow.com/questions/3412449/why-does-math-round-return-a-long-but-math-floor-return-a-double – starblue

उत्तर

61

double की सीमा long से अधिक है। उदाहरण के लिए:

double x = Long.MAX_VALUE; 
x = x * 1000; 
x = Math.ceil(x); 

क्या आप अंतिम पंक्ति करने के लिए उम्मीद करेंगे अगर Math.ceil लौटे long?

ध्यान दें कि बहुत बड़े मूल्यों (सकारात्मक या नकारात्मक) पर संख्याएं बहुत कम वितरित होती हैं - इसलिए पूर्णांक पूर्णांक से अधिक पूर्णांक xx + 1 नहीं होगा यदि आप देखते हैं कि मेरा क्या मतलब है।

+0

मुझे लगता है कि आप अपने अंतिम वाक्य में हैं परिशुद्धता के ढीले के बारे में बात करते हुए, लेकिन मुझे लगता है कि यह उच्च संख्या पर निर्भर नहीं है बल्कि इसके महत्वपूर्ण अंकों की संख्या (बाइनरी में) पर निर्भर करता है। मैं एक उदाहरण खोजने की कोशिश करूंगा। – aalku

+0

@ user270349: लगातार डबल मानों के बीच पूर्ण अंतर बड़ा हो जाता है क्योंकि मान बड़ा हो जाता है। प्रतिनिधित्व किए गए महत्वपूर्ण अंकों की संख्या वही है (असामान्य संख्याओं के अलावा)। –

+2

उदाहरण: '2^60' को डबल के रूप में प्रदर्शित किया जा सकता है जबकि' 2^60 (+/-) 1' – aalku

13

एक डबल Long.MAX_VALUE से बड़ा हो सकता है। यदि आप इस तरह के मूल्य पर Math.ceil() पर कॉल करते हैं तो आप एक ही मूल्य वापस करने की उम्मीद करेंगे। हालांकि अगर यह एक लंबा लौटा, तो मूल्य गलत होगा।

+0

'long.MAX_VALUE' से बड़े 'डबल' मानों का बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है, इसलिए' ceil (big_double) 'का' डबल' परिणाम 'big_double + 1' नहीं होगा। तो यह अभी भी गलत है ... –

+0

@CiprianTomoiaga आप सही हैं कि यह big_double +1 नहीं होगा क्योंकि यह big_double होगा। कोई भी मान जो 'लम्बे' के रूप में प्रतिनिधित्व करने के लिए बहुत बड़ा है, उसका कोई अंश भाग नहीं है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^