2009-02-04 19 views

उत्तर

64

ही जावाडोक के अनुसार:

तो तर्क NaN या एक अनन्तता या सकारात्मक शून्य या नकारात्मक शून्य है, तो परिणाम तर्क के रूप में एक ही है। एक int के साथ ऐसा नहीं कर सकता।

सबसे बड़ा डबल मान सबसे बड़ा int से भी बड़ा है, इसलिए इसे लंबा होना होगा।

+1

मान लीजिए यह नेट के लिए भी लागू होता है? – Graviton

+33

गणित के साथ असंगत लगता है। राउंड फ़ंक्शन, जो int/long लौटाते हैं और विशेष मामलों को एक अलग तरीके से संभालते हैं। – zod

+1

ध्यान दें कि जावाडोक का कहना है कि यह _ सबसे बड़ा (सकारात्मक अनंतता के निकटतम) *** फ्लोटिंग-पॉइंट मान *** देता है जो कि तर्क से कम या बराबर है और गणितीय पूर्णांक के बराबर है "_। एक मान _x> 2^53_ दिया गया है जो उसके आंशिक भाग के साथ मूल्य के समान नहीं होगा। यह उससे काफी छोटा हो सकता है। –

13

यह सटीकता के लिए है। डबल डेटा-टाइप में 53 बिट मंटिसा है। अन्य चीजों के बीच इसका मतलब है कि एक डबल सटीक हानि के बिना 2^53 तक पूरी तरह से प्रतिनिधित्व कर सकता है।

यदि आप इतनी बड़ी संख्या को एक पूर्णांक में संग्रहीत करते हैं तो आपको ओवरफ़्लो मिल जाएगा। इंटीग्रर्स में केवल 32 बिट हैं।

दोहराव के रूप में पूर्णांक को वापस करना सही काम है क्योंकि यह एक पूर्णांक की तुलना में बहुत अधिक उपयोगी उपयोगी संख्या प्रदान करता है।

+0

यह निश्चित रूप से ऐसे मूल्यों का सामना करने के लिए एक लंबा समय लौटा सकता है। आपको अभी भी काम करना होगा कि डबल्स> 2^63 के साथ क्या करना है। –

+1

@ जोन, सच है, लेकिन इसके परिणामस्वरूप प्रदर्शन प्रभाव होगा (किसी भी निर्देश सेट में लंबे समय से दो तक रूपांतरण निर्देश नहीं है जिसे मैं जानता हूं)। मुझे आश्चर्य है कि Math.floor डबल्स के साथ क्या करता है> 2^53 पहली जगह पर। कुछ परिणाम प्रतिनिधित्व योग्य नहीं हैं। –

+0

लेकिन फिर, छद्म-मूर्खतापूर्ण रूप (int) Math.floor (foo), जो आधिकारिक जावाडोक में भी दिखाई देता है असुरक्षित है क्योंकि परिणाम int में फिट नहीं हो सकता है, क्या मैं सही हूँ? और फिर फिर, जो Math.floor का उपयोग करने के लिए एक सुरक्षित रूप है, क्योंकि परिणाम भी लंबे समय तक फिट नहीं हो सकता है? – Raibaz

0

ताकि त्रुटि और अन्य गैर पूर्णांक मान गणना की श्रृंखला के माध्यम से सही ढंग से कैस्केड कर सकें।

उदाहरण के लिए, यदि आप Math.floor में नंबर नहीं (NaN) फ़ीड करते हैं, तो यह इसे पास कर देगा।

यदि यह पूर्णांक लौटाता है तो यह इन स्थिति या त्रुटियों को पास नहीं कर सका, और आप पहले की गणना से खराब परिणाम प्राप्त कर सकते हैं जो अच्छे लगते हैं लेकिन आगे की प्रक्रिया के बाद गलत हैं।

-Adam

3

क्या आप अगर आप इसे दे दी है यह वापस जाने के लिए चाहते हो जाएगा एक डबल सबसे बड़ा पूर्णांक या लंबे समय से भी बड़ा?

(वैसे अगर यह सबसे बड़ा लंबा परिशुद्धता से भी बड़ा है कम वैसे भी होगा - यह निकटतम सैद्धांतिक पूर्णांक नहीं हो सकता है - लेकिन फिर भी ...)

0

एक पूर्णांक है बस के रूप में और एक चल बिन्दु जावा में विभाजन, वहाँ पूर्णांक और चल बिन्दु तरीके फर्श करने के लिए कर रहे हैं:

double f = Math.floor(x); 

या

int k = (int) x; 

लेकिन आप हमेशा च के साथ फर्श उपयोग करने के साथ सावधान रहना चाहिए अंतर्निहित सटीक अंकगणितीय: x की आपकी गणना 1.99 99 99 99 जैसी कुछ उत्पन्न कर सकती है जिसे दोनों रूपों से 1 तक नहीं किया जाएगा। वहां कुछ एल्गोरिदम हैं जिन्हें कुछ इनपुट मानों के गलत परिणामों को उत्पन्न करने से बचने के लिए इस सीमा के आसपास काम करने की आवश्यकता है।

+4

यह लगभग काम करता है, सिवाय इसके कि (int) -1.5 = -1; – PearsonArtPhoto

5

अन्य लोगों ने आपको बताया है कि, मैं आपको यह बताने जा रहा हूं कि आप इसे कैसे करना चाहते हैं।

int a=(int) 1.5; 

हालांकि, (int) हमेशा 0. की ओर दौर इस प्रकार, यदि आप एक ऋणात्मक संख्या क्या करना चाहते हैं: आप केवल सकारात्मक संख्या का उपयोग करने जा रहे हैं, तो आप इस कथन का उपयोग कर सकते

int a=(int) -1.5; //Equal to -1 

मेरे मामले में, मैं यह नहीं करना चाहता था।मैंने गोल करने के लिए निम्नलिखित कोड का उपयोग किया, और ऐसा लगता है कि सभी किनारे के मामलों को अच्छी तरह से संभाला जाता है:

private static long floor(double a) 
{ 
    return Math.round(Math.floor(a)); 
} 
+2

'(int) Math.floor (ए) 'का उपयोग क्यों नहीं करें? यह शायद अधिक कुशल है और यह छोटा है। –

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