2012-05-12 13 views
5
for($i=0;$i<=2;$i+=0.1){ 
    echo $i."<br>"; 
} 

परिणाम मैं चाहता है:इच्छित मूल्य तक पहुंचने से पहले यह लूप स्टॉप के लिए क्यों करता है?

0 
0.1 
0.2 
0.3 
0.4 
0.5 
0.6 
0.7 
0.8 
0.9 
1 
1.1 
1.2 
1.3 
1.4 
1.5 
1.6 
1.7 
1.8 
1.9 
2 

क्या बजाय होता पाश 1.9 पहुँचता है और बंद हो जाता है। क्यूं कर?

+4

@Brad, कि सफाई के लिए धन्यवाद। आपने यह सवाल बहुत अधिक पठनीय और बचाया है। प्रश्न के लिए +1! शायद हमें इसे वोट करने से पहले एक प्रश्न को और अधिक बारीकी से देखना चाहिए, क्योंकि हमारे पास निश्चित रूप से इसे बदलने की शक्ति है। – jmort253

उत्तर

0

यह चल बिन्दु परिशुद्धता के कारण काम नहीं करता। संख्या बेस 2 प्रारूप में संग्रहीत हैं और गोल करने के कारण कभी सटीक नहीं हैं। जब आप .1 से 1.9 जोड़ते हैं, तो आप 2.0 के साथ समाप्त नहीं होते हैं। आप 1.99 999 की तरह कुछ खत्म कर देते हैं। अगले पुनरावृत्ति पर आप बेस 2 प्रारूप में जो राउंड करते हैं उसके आधार पर आप 2.0 99 998 की तरह कुछ खत्म कर देंगे।

अधिक जानकारी के लिए देख Floating point numbers और Double-precision floating-point format

तुम भी परिणाम आप कर रहे हैं पाने के लिए कुछ इस तरह कर सकता है के बाद

for ($i = 0; $i < 2.1; $i += .1){ 
    echo $i . '<br />'; 
} 
+0

यही है जिसे मैं यहूदी कहता हूं। – Strawberry

+0

सवाल यह था कि "यह क्यों काम नहीं करता", इसलिए कोड के अतिरिक्त फ़्लोटिंग पॉइंट्स के बारे में कुछ स्पष्टीकरण आपको वोट-वोट प्राप्त कर लेगा। – Spudley

+0

धन्यवाद, अब मैं इसे समझता हूं! – Jelly

5

वजह से, यह प्राप्त कभी नहीं होगा floating point == integer

+0

+1 बिल्कुल। यदि आप इसे काम करना चाहते हैं तो आपको यह जांचने की आवश्यकता है कि == 2.0 – EmmanuelG

0

आप क्या कर सकते हैं द्वारा:

for($i=0;$i<=20;$i+=1){ 
    echo ($i/10)."<br>"; 
}