2012-09-14 19 views
5

वहाँ जब मैं निम्नलिखित कोड चलाने अस्पष्ट पूर्णांकन त्रुटि किसी तरह का हो रहा है है। उस बिंदु पर PriorityJob * 100.0 का मूल्यांकन 140 देता है। बाद में roundedTotal = 139परिणाम गलत

जाहिर है, 140.0 का अर्थ 13 9.9 99 99 के रूप में किया जा रहा है। क्या यह फ्लोटिंग पॉइंट इंजन में कमी है? मैने ऐसा पहले कुछ भी नहीं देखा है।

+1

आप कभी नहीं देखा है नाव संख्याएं अनुमानित? –

+4

1.4 एक फ्लोट के रूप में मौजूद नहीं है। वास्तव में, 1.0 और 2.0 के बीच भी असीमित संख्याएं हैं जिन्हें फ़्लोट के रूप में प्रदर्शित नहीं किया जा सकता है, 1.4 उनमें से एक है। तो यह 1.4 के अनुमान के रूप में संग्रहीत हो जाता है, 1.3999999999999999 – nos

+0

@LuchianGrigore ऐसा लगता है कि यह इतना आसान ऑपरेशन है। ऐसा क्यों विफल होना चाहिए? –

उत्तर

10

बस हर आधुनिक कंप्यूटर फ्लोटिंग-पॉइंट नंबरों के लिए binary representation का उपयोग करता है।

बस के रूप में 1/3 = 0.33333333... दशमलव भिन्न के रूप में ठीक वैसे ही प्रदर्शित नहीं किया जा सकता है, तो 1/10 (1.4 सहित और इसलिए सबसे गैर पूर्णांक दशमलव मान,) एक द्विआधारी अंश के रूप में ठीक वैसे ही प्रदर्शित नहीं किया जा सकता। इसके बजाय निकटतम प्रतिनिधित्व योग्य मूल्य द्वारा इसका प्रतिनिधित्व किया जाएगा, जो "सत्य" मान से थोड़ा अधिक या कम हो सकता है।

आप के बजाय निकटतम पूर्णांक तक पूर्णांक बनाना चाहते हो सकता है: (int)(PriorityJob * 100.0 + 0.5)

+1

और प्रदर्शित मूल्यों में अंतर आता है क्योंकि 'std :: cout << प्राथमिकता जोब * 100.0' राउंड, जबकि 'int roundTotal = PriorityJob * 100.0' आंशिक भाग छोड़ देता है। –

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