2012-08-26 11 views
6

मैं 9. मिल रहा संदिग्ध यह था, क्योंकि पूर्णांक नीचे दौर जब मैं इसगणित समीकरण जावा में कैसे काम करते हैं?

int test = 5 + 3 * (4 - 1)/2; 

की तरह कुछ है। हालांकि, जब मैं इस

float test = 5 + 3 * (4 - 1)/2; 

कर मैं भी 9. हालांकि मिलता है, जब मैं इस

float test1 = 5; 
float test2 = 4.5; 
float test = test1 + test2; 

टेस्ट अंत में आउटपुट 9.5 है। क्या कोई इसके पीछे तर्क समझा सकता है? दूसरे उदाहरण में मुझे 9.5 क्यों नहीं मिलता? धन्यवाद।

+0

इंटीजर डिवीजन जावा की तरह बहुत सारी भाषाओं में इस तरह से किया जाता है। सभी सी भाषाएं इस तरह से कार्य करती हैं: सी, सी ++, सी #, जावा, जावास्क्रिप्ट। – duffymo

उत्तर

16

अपने दूसरे उदाहरण में, हालांकि आप परिणाम बताए प्रकार float के एक चर करने के लिए कर रहे हैं, गणना में ही अभी भी वास्तव में पहला उदाहरण के रूप में एक ही तरीके से किया जाता है। दाएं हाथ की गणना करने के तरीके को निर्धारित करने के लिए जावा गंतव्य चर प्रकार को नहीं देखता है। विशेष रूप से, उप-संपीड़न 3 * (4 - 1)/2 परिणाम 4 में परिणाम।

इसे ठीक करने के लिए आप चल बिन्दु शाब्दिक बजाय सभी पूर्णांकों का उपयोग कर सकते हैं:

float test = 5 + 3 * (4 - 1)/2.0f; 

2.0f चल अंकगणितीय अभिव्यक्ति के लिए बिंदु गणना चलाता का उपयोग करना।

+0

यह समझ में आता है, लेकिन ऐसा लगता है कि इसका ट्रैक रखने के लिए दर्द का थोड़ा सा हिस्सा होगा। धन्यवाद। – glcohen

+0

@ user1626448: अधिकांश समय, आप एक या अधिक मौजूदा चर के साथ गणना कर रहे होंगे, जिसमें पहले से ही 'फ्लोट' या 'डबल' या जो कुछ भी हो। उस स्थिति में आपको इसके बारे में चिंता करने की ज़रूरत नहीं है। –

3

हालांकि आप एक नाव में 5 + 3 * (4 - 1)/2 का परिणाम प्रतिनिधित्व करते हैं, वास्तविक मूल्यांकन एक पूर्णांक के परिशुद्धता के साथ किया जाता है, जिसका अर्थ है कि 9/2 रिटर्न 4 के बजाय 4.5 के विभाजन आप अगर वे तैरता के रूप में मूल्यांकन किया गया प्राप्त होगा।

2

अभिव्यक्तियों का अपना प्रकार है। तो इसके साथ शुरू करें:

5 + 3 * (4 - 1)/2 

प्रत्येक मान का अपना प्रकार होता है। इस प्रकार का int होता है, तो यह रूप में ही है: यह स्पष्ट है कि हम ints साथ काम कर रहे बनाना

((int)5) + ((int)3) * (((int)4) - ((int)1))/((int)2) 

। इसके बाद ही 9 के रूप में मूल्यांकन किया जाता है, यह एक फ्लोट को सौंपा जाता है।

0

संक्षिप्त उत्तर यह है कि पूर्णांक प्रकार मॉड्यूलर अंकगणितीय पर मॉड्यूलस 1 के साथ संचालित होते हैं, और शेष को छोड़ देते हैं।

चूंकि आप एक पूर्णांक के रूप में test डाली, मॉड्यूलर अंकगणितीय मापांक 1 (जैसे 9.5 आधुनिक 1), पूर्णांक परीक्षण के साथ कार्यरत है = 5 + 3 * (4 - 1)/2;

32-या -64 बिट फ्लोट के साथ यह 9.5 देगा; हालांकि, क्योंकि आपने test को int के रूप में डाला है, शेष को त्याग दिया गया है, और test द्वारा संदर्भित मान 9।

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