2011-11-11 15 views
5

क्या यह जावा में एक गड़बड़ है?जावा गड़बड़ाना? संख्या घटाना?

मैं इस अभिव्यक्ति को हल करने के लिए जाना: -: -3,9999999999999996

यहाँ क्या हो रहा है 3.1 7.1

मैं इस सवाल का जवाब मिल सकता है?

+15

चल बिन्दु गणित क्या हो रहा है है। –

+0

[इस] (http://stackoverflow.com/questions/2798830/double-precision-values) और दूसरों का एक टन जैसी चीज़ें देखें। (अरे, WECSSKAFPN लेख कहां जाता है?) –

+2

यह सबसे आम प्रोग्रामिंग प्रश्न होना चाहिए। .... –

उत्तर

10

यहां एक महान स्पष्टीकरण मिल सकता है। http://www.ibm.com/developerworks/java/library/j-jtp0114/

फ़्लोटिंग पॉइंट अंकगणित शायद ही कभी सटीक है। जबकि कुछ संख्याएं, 0.5 के रूप में, वास्तव में बाइनरी (बेस 2) दशमलव के रूप में प्रदर्शित की जा सकती हैं ( 0.5 बराबर 2-1), अन्य संख्याएं, जैसे 0.1, हो सकती हैं। नतीजतन, फ्लोटिंग पॉइंट ऑपरेशंस के परिणामस्वरूप गोलाकार त्रुटियां हो सकती हैं, परिणाम जो कि निकट है - लेकिन इसके बराबर नहीं - परिणामस्वरूप आप उम्मीद कर सकते हैं। उदाहरण के लिए, 2.600000000000001 के बजाय 2.6 में परिणाम के नीचे साधारण गणना:

double s=0; 

for (int i=0; i<26; i++) 
    s += 0.1; 
System.out.println(s); 

इसी तरह, गुणा .1 * 26 एक परिणाम ही .1 जोड़ने 26 बार से अलग अर्जित करता है। फ्लोटिंग पॉइंट से पूर्णांक तक कास्टिंग करते समय गोल करने वाली त्रुटियां और भी गंभीर बन जाती हैं, क्योंकि पर कास्टिंग अभिन्न प्रकार गैर-अभिन्न अंग को छोड़ देता है, यहां तक ​​कि गणना के लिए भी "जैसा दिखता है" उनके पास अभिन्न मूल्य होना चाहिए। उदाहरण के लिए, निम्नलिखित बयानों:

double d = 29.0 * 0.01; 
    System.out.println(d); 
    System.out.println((int) (d * 100)); 

आउटपुट के रूप में उत्पादन करेगा:

0.29 
    28 

जो संभव है कि आप पहली बार में उम्मीद कर सकते हैं नहीं है।

अधिक जानकारी के लिए प्रदत्त संदर्भ देखें।

1

कंप्यूटर गणित की दुनिया में 100% है जो सही है, औसत व्यक्ति के लिए यह सही नहीं है। जावा को किसी विशिष्ट संख्या पर कोई त्रुटि नहीं हो सकती क्योंकि यह केवल कोड है जो एक ही तरीके से चलता है लेकिन इसमें एक अलग इनपुट होता है!

पीएस गूगल कैसे

उसी तरह चल अंक में

+0

धन्यवाद आदमी। यह वास्तव में अजीब है ... – Confiqure

+0

'जावा में कोई त्रुटि नहीं हो सकती है ?? मैंने कभी ऐसी कंप्यूटर सिस्टम से मुलाकात नहीं की है जिसमें कोई बग नहीं है .... –

+0

नहीं, मेरा मतलब है कि एक साधारण जोड़ में, इसका कहना है कि 5 + 5 सही होगा 6 + 5 वोन्ट, – Hego555

1

राउंडिंग त्रुटियों एक संख्या पूर्णांक बनाना कि 3 * 0.1 != 0.3

1

स्वचालित प्रकार पदोन्नति हो रहा है (जब यह संकलक कम से कम से मुड़ा हुआ नहीं है) और है कि परिणाम है।

यहां कुछ संसाधन सीखने के लिए है।

http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html

अगले कदम होगा दिया परिशुद्धता/आवश्यकताओं के यह फ़ॉर्मेट करने के लिए formatters उपयोग करने के लिए सीखना है।

2

जैसा कि कई अन्य लोगों ने बताया है कि आप double पर भरोसा नहीं कर सकते हैं यदि आप एक सटीक दशमलव मान प्राप्त करना चाहते हैं, उदा। मौद्रिक अनुप्रयोगों को लागू करते समय।क्या आप के बजाय क्या करना चाहिए BigDecimal को करीब से देख लेने के लिए है:

BigDecimal a = new BigDecimal("3.1"); 
BigDecimal b = new BigDecimal("7.1"); 
BigDecimal result = a.subtract(b); 
System.out.println(result);  // Prints -4.0 
संबंधित मुद्दे