2011-10-28 9 views
5

कोई भी कृपया बता सकता है कि यह अलग-अलग आउटपुट क्यों देता है?आर राउंडिंग स्पष्टीकरण

round(1.49999999999999) 
1 


round(1.4999999999999999) 
2 

मैंने राउंड दस्तावेज पढ़ा है लेकिन इसमें इसके बारे में कुछ भी उल्लेख नहीं है। मुझे पता है कि आर बाइनरी रूप में संख्याओं का प्रतिनिधित्व करता है, लेकिन दो अतिरिक्त 9 के परिणाम को क्यों बदलता है?

धन्यवाद।

+0

सी [इस उत्तर] [1] आर में समस्याओं के बारे में [1]: http://stackoverflow.com/questions/1535021/whats-the-biggest-r-gotcha-youve- रन-एंड/33 9 8868 # 33 9 8868 – John

उत्तर

7

तो यह 1.5 तक पूर्ण हो जाता है 1.4999999999999999 आंतरिक रूप से प्रदर्शित नहीं किया जा सकता है।

अब, जब आप round() लागू करते हैं, तो परिणाम 2 है।

+0

धन्यवाद, आर कभी-कभी दशकों के साथ कुछ अजीब परिणाम दे सकता है। – user557240

+5

@ user557240 इस संबंध में आर के बारे में कुछ भी अजीब बात नहीं है। – joran

2

उन दो संख्याओं को चर में रखें और फिर इसे प्रिंट करें - आप देखेंगे कि वे अलग हैं।

कंप्यूटर, इस सटीक मूल्य के साथ संख्या में इस तरह की दुकान नहीं है (वे decadic संख्या internaly उपयोग न करें)

+1

आप उन्हें मुद्रित करने से पहले 'विकल्प (अंक = 20)' बेहतर सेट करेंगे, या वे ** देखें ** समान –

+0

जैसा कि अन्य प्रतिक्रियाओं में उल्लेख किया गया है - 1.4 99 99 99 99 99 99 999 1.5 के रूप में संग्रहीत है एक ही परिणाम नहीं मिलेगा! – Hurda

2

मैंने कभी भी आर का उपयोग नहीं किया है, इसलिए मुझे नहीं पता कि यह मुद्दा है, लेकिन सी/सी ++ जैसी अन्य भाषाओं में 1.499 99 99 99 99 99 999 की संख्या एक फ्लोट या डबल द्वारा दर्शायी जाती है।

चूंकि इनमें सीमित परिशुद्धता है, तो आप बिल्कुल 1.499 99 99 99 99 99 999 जैसे कुछ का प्रतिनिधित्व नहीं कर सकते हैं। यह मामला हो सकता है कि फ्लोटिंग पॉइंट परिशुद्धता पर सीमाओं के कारण 1.4 99 99 99 99 99 99 999 वास्तव में 1.50000000000000 के रूप में संग्रहीत हो जाता है।

+1

आर आईईईई फ्लोटिंग पॉइंट अंकगणित का उपयोग करता है, इसलिए इसमें एक ही समस्या है। –

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