2012-09-13 36 views
5

के रूप में प्रदर्शित करता है मैं बसपा के साथ एक कैलकुलेटर बना रहा हूं। जैसा कि मैंने इसे विभिन्न संख्याओं के साथ परीक्षण किया, मैं एक समस्या में भाग गया कि दशमलव संख्या सही तरीके से प्रदर्शित नहीं होती है।58.85 58.84999999999

उदाहरण के लिए। 58.85 -> 58.849999। लेकिन 58.84 या 58.86 काम ठीक है। 58.8471 -> 54.84710000000001। अंत में अंतिम टाइप किए गए अंक कहीं से भी सहेजे नहीं जाएंगे।

मेरा कोड नीचे दिए गए कोड।

method GENERATE_NUM. 

    DATA: lv_digi type I. * number of digits after the decimal point 


    call METHOD me->get_decimal 
    RECEIVING 
     getdigits = lv_digi. 

    *if it is a natural number 
    IF lv_digi = 0. 
    IF thisnum < 0. 
     result = thisnum * 10 - newdigit. 
    ELSE. 
     result = thisnum * 10 + newdigit. 
    ENDIF. 

    *if it is a float number 
    Else. 
    IF thisnum < 0. 
     result = thisnum - (newdigit/10 ** lv_digi). 
    ELSE. 
     result = thisnum + (newdigit/10 ** lv_digi). 
    ENDIF. 

    *increase the number of decimal point by 1 
    call method me->set_decimal. 
    ENDif. 

endmethod. 

मैं मूल रूप से क्या करना है हर एक संख्या क्लिक किया जाता है, यह "generate_num" प्रणाली को बुलाती है। यह पैरामीटर के रूप में THISNUM, NEWDIGIT, RESULT लेता है।
thisnum = वर्तमान संख्या (उदाहरण: 58.8)
newdigit = क्लिक किया गया नंबर (उदाहरण: 5)
परिणाम = जेनरेट नंबर (अपेक्षित: 58.85 लेकिन 58.849 999 लौटाता है)।

+1

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Mysticial

+0

यदि आप इस समस्या को हल करने के लिए कहां और कैसे हल करते हैं तो यह सहायक होगा? –

+0

यह उन सामान्य प्रश्नों में से एक है जिन्हें बहुत लंबे स्पष्टीकरण की आवश्यकता होती है। मैं किसी और को बंद करने के लिए एक उपयुक्त डुप्लिकेट खोजने या खोजने दूंगा। – Mysticial

उत्तर

7

जब आप निश्चित परिशुद्धता के साथ दशमलव संख्या चाहते हैं, तो आपको फ्लोट के बजाय प्रकार पी (पैक नंबर) का उपयोग करना चाहिए।

उदाहरण:

DATA lv_fixed_point TYPE p LENGTH 16 DECIMALS 2. 

इस बिंदु के बाद दो अंकों के साथ एक निश्चित बिंदु चर पैदा करता है। "लंबाई" पैरामीटर का सटीक अर्थ सीधे-आगे नहीं है। documentation से:

पैक्ड संख्या - P टाइप

प्रकार पी डेटा दशमलव बिंदु के बाद अंक अनुमति देता है। दशमलव स्थानों की संख्या सामान्य है, और कार्यक्रम में निर्धारित है। मूल्य प्रकार पी डेटा की श्रेणी दशमलव बिंदु के बाद इसके आकार और अंकों की संख्या पर निर्भर करती है। वैध आकार 1 से 16 बाइट्स से कोई भी मान हो सकता है। दो दशमलव अंक एक बाइट में पैक किए जाते हैं, जबकि अंतिम बाइट में एक अंक और चिह्न होता है। दशमलव बिंदु के बाद 14 अंकों तक की अनुमति है। प्रारंभिक मान शून्य है। प्रकार पी डेटा के साथ काम करते समय, प्रोग्राम विशेषता को सेट करना एक अच्छा विचार है फिक्स्ड पॉइंट अंकगणितीय। अन्यथा, पी संख्याओं को पूर्णांक के रूप में माना जाता है।

आप दूरी, वजन, धन के रूप में ऐसे मूल्यों के लिए प्रकार पी डेटा का उपयोग कर सकते हैं, और इसी तरह।

+0

बस मेरी समस्या हल करने के लिए प्रकार को बदलने के लिए। आपका बहुत बहुत धन्यवाद। –

0

या आप आईईईई फ्लोट ईपीएसलॉन में कारक के लिए CALL FUNCTION 'FLOATINGPOINT_COMPARE_ABSOLUTE' पर कॉल कर सकते हैं। चल बिन्दु के साथ कार्य करना आप वास्तव में सीधे तुलना का उपयोग कर से बचना चाहिए, और निर्मित epsilons साथ अपने स्वयं के बारे में:

IS_EQUAL 
IS_GREATER 
IS_GREATER_EQUAL 
IS_LESS 
IS_LESS_EQUAL 

न्यूनतम कर रहे हैं।

और पढ़ें about floating point here

इसे जानें। इसको जियो। इसे प्यार करना।

एक गैर तुच्छ व्यायाम आप भी (यदि आप f के बजाय अन्य DECFLOAT प्रकार के साथ काम करने में भी स्नान) पर NaN+Inf और -Inf पढ़ सकते हैं।

+0

लेकिन पैक किया गया सबसे कम समाधान के साथ इष्टतम समाधान हो सकता है (लेकिन तेज़ नहीं है क्योंकि उन्हें अभी भी चार्ज-किडा के रूप में व्याख्या किया जाता है)। – Marius