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

Kết quả tôi muốn là:Tại sao điều này cho vòng lặp dừng lại trước khi đạt giá trị dự định?

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 

gì sẽ xảy ra thay vì là vòng lặp đạt 1.9 và dừng lại. Tại sao?

+4

@Brad, nhờ làm sạch mà lên. Bạn đã làm cho câu hỏi này dễ đọc hơn nhiều và có thể cứu vãn được. +1 cho câu hỏi! Có lẽ chúng ta nên xem xét kỹ hơn một câu hỏi trước khi bỏ phiếu xuống, vì chúng ta chắc chắn có sức mạnh để xoay nó. – jmort253

Trả lời

0

này không hoạt động do dấu chấm động chính xác. Các số được lưu trữ ở định dạng cơ sở 2 và không bao giờ chính xác do làm tròn. Khi bạn thêm .1 đến 1.9, bạn không kết thúc với 2.0. Bạn kết thúc với một cái gì đó như 1.99999. Trong lần lặp tiếp theo, bạn sẽ kết thúc với một cái gì đó như 2.099998 tùy thuộc vào những gì nó làm tròn ở định dạng cơ sở 2.

Để biết thêm thông tin, xem Floating point numbersDouble-precision floating-point format

Bạn cũng có thể làm một cái gì đó như thế này để có được những kết quả mà bạn đang theo đuổi

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

Đó là điều tôi gọi là ghetto. – Strawberry

+0

câu hỏi là "tại sao nó không hoạt động", vì vậy một số lời giải thích về các điểm nổi bên cạnh mã sẽ giúp bạn tăng số phiếu bầu. – Spudley

+0

Cảm ơn bạn, giờ tôi đã hiểu! – Jelly

5

Bởi vì, nó sẽ không bao giờ đạt được floating point == integer

+0

+1 Chính xác. Nếu bạn muốn điều này hoạt động, bạn cần kiểm tra xem == 2.0 – EmmanuelG

0

Bạn có thể làm theo:

for($i=0;$i<=20;$i+=1){ 
    echo ($i/10)."<br>"; 
} 
Các vấn đề liên quan