2011-09-30 22 views
6

संभव डुप्लिकेट:
Is JavaScript's Math broken?
Why can't decimal numbers be represented exactly in binary?सम: अजीब व्यवहार

आगे क्या कोड का परिणाम हो जाएगा:

if(0.3 == (0.1 + 0.1 + 0.1)) 
{ 
     alert(true); 
} 
else 
{ 
     alert(false); 
} 

यह अजीब है, लेकिन परिणाम झूठा होगा।

कारण

0,1 + 0,1 की है कि परिणाम है + 0,1

हो जाएगा

0,30000000000000004

कैसे इस व्यवहार समझाया जा सकता है?

+2

देखें http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary – mtrw

+1

और, विशेष रूप से जावास्क्रिप्ट में, http://stackoverflow.com/questions/4088590/0-43-इन-जावास्क्रिप्ट-नहीं-1-2-its-1-20000000002-क्या हो रहा है –

+2

शायद आपको एक प्रश्न पूछने से पहले अक्सर पूछे जाने वाले प्रश्नों की सलाह का पालन करना चाहिए जो पहले से ही एक गजियन बार पूछे जा चुके हैं । – paxdiablo

उत्तर

2

यह इसी कारण 1/3 + 1/3 + 1/3 आप दशमलव में वास्तव में 1 नहीं दे सकता है। यदि आप 1/3 के रूप में .33333333 का उपयोग करते हैं, तो 1/3 + 1/3 + 1/3 आपको .9999999 देगा जो बिल्कुल ठीक नहीं है।

जब तक आप बिल्कुल नहीं जानते कि आप क्या कर रहे हैं, समानता के लिए गैर-पूर्णांक संख्यात्मक प्रकारों की तुलना न करें।

1

यह कंप्यूटरों में संग्रहीत फ्लोट की प्रकृति के कारण है। मनमाने ढंग से फ़्लोटिंग पॉइंट नंबर को स्टोर करने का सटीक तरीका जैसी कोई चीज़ नहीं है। क्या आप आमतौर पर करते हैं आप तैरता की तुलना करता है, तो अंतर कुछ छोटी संख्या एप्सिलॉन से छोटा होता है देखने के लिए, इस तरह है:

function equals(f1, f2){ 
    var epsilon = 0.00001; //arbitrary choice 
    return (f1-f2 < epsilon && f2-f1 < epsilon); 
} 
तो अपने मामले में

, अगर परिवर्तन (0.3 == (0.1 + 0.1 + 0.1)) यदि (0.3 के बराबर है, (0.1 + 0.1 + 0.1))

1

जो आप अनुभव कर रहे हैं वह मूल फ़्लोटिंग पॉइंट राउंडिंग त्रुटि है।

हम द्विआधारी संख्याओं की प्रकृति के कारण कुछ त्रुटि के बिना 0.1 का प्रतिनिधित्व नहीं कर सकते हैं। WolframAlpha reports दशमलव 0.1 बराबर द्विआधारी ~ 0.00011001100110011 ... ध्यान दें कि इसे बाइनरी संख्या प्रणाली में कैसे पूर्ण रूप से प्रदर्शित नहीं किया जा सकता है? इसका मतलब है कि हमें एक कट ऑफ पॉइंट पर निर्णय लेना है जिस पर इस नंबर की गणना करना बंद करना है अन्यथा हम हमेशा यहां रहेंगे।

यह एक त्रुटि प्रस्तुत करता है। और यह त्रुटि संचित हो गई है क्योंकि कोड संख्याओं को एक साथ जोड़ता है जिसके परिणामस्वरूप आपकी राशि के अंत में एक अविश्वसनीय रूप से छोटी मात्रा में जोड़ा जाता है। यह सुनिश्चित करता है कि योग कभी भी 0.3 नहीं होगा, जो IF परीक्षण की तलाश में है।

कुछ दशमलव संख्या, हालांकि, बाइनरी में सटीक रूप से प्रतिनिधित्व किया जा सकता है जैसे कि dec 0.5 = bin 0.1 और dec 0.25 = bin 0.01।

We can demonstrate this 0.5 = (0.25 + 0.25) का उपयोग कर अपने मूल कोड के समान ही।


इस पर आगे पढ़ने के लिए मैं The Floating-Point Guide की अनुशंसा करता हूं।

यह फ़्लोटिंग पॉइंट नंबरों की अवधारणा का एक अच्छा अवलोकन प्रदान करता है और गणना में त्रुटियां कैसे उत्पन्न हो सकती हैं। जावास्क्रिप्ट पर एक अनुभाग भी है जो दर्शाता है कि आप जिस गोलियों की त्रुटियों का सामना कर रहे हैं उन्हें कैसे दूर किया जाए।

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