2010-10-19 46 views
18

Tôi muốn sử dụng vòng lặp for cho vấn đề của tôi, không phải trong thời gian. Có thể thực hiện những việc sau không ?:cho vòng lặp, tăng thêm gấp đôi

for(double i = 0; i < 10.0; i+0.25) 

Tôi muốn thêm giá trị kép.

+2

Chỉ cần nhớ rằng do lỗi làm tròn (nhầm lẫn tôi biết), bạn rất có thể sẽ không kết thúc vào một số vòng đẹp. – Blindy

+2

Điều đó xảy ra là tất cả các giá trị được lấy bởi 'i' trong chương trình của bạn có thể biểu diễn chính xác như giá trị' double', nhưng đây là thói quen xấu để ghi các vòng lặp với các dấu phẩy động theo cách này. Điểm nổi cần được quan tâm nhiều hơn điều này nếu bạn không muốn thấy kết quả lạ. Xem ví dụ http://www.mc.edu/campus/users/travis/syllabi/381/patriot.htm –

+2

@Blindy Đối với chương trình chính xác này, có anh ta sẽ làm. Đối với một chương trình hơi khác, anh sẽ không làm thế. –

Trả lời

46

Để tránh bị cắn bởi vật nổi điểm số học, bạn có thể muốn sử dụng một biến số nguyên vòng lặp và lấy được các giá trị dấu chấm động bạn cần bên trong vòng lặp của bạn:

for (int n = 0; n <= 40; n++) { 
    double i = 0.25 * n; 
    // ... 
} 
25

Thay vào đó, bạn có thể sử dụng i += 0.25.

+0

đã tìm kiếm điều này !! –

2
for(double i = 0; i < 10.0; i+=0.25) { 
//... 
} 

Đã thêm = biểu thị phím tắt cho i = i + 0,25;

6

câu trả lời của James bắt gặp những lỗi rõ ràng nhất . Nhưng có một vấn đề phụ (và IMO hướng dẫn hơn), trong đó các giá trị dấu phẩy động không nên được so sánh với (un) bình đẳng.

Vòng lặp đó dễ bị lỗi, chỉ sử dụng giá trị số nguyên và tính giá trị kép bên trong vòng lặp; hoặc, ít thanh lịch hơn, hãy tạo cho mình một số lợi nhuận: for(double i = 0; i < 9.99; i+=0.25)

Chỉnh sửa: so sánh ban đầu sẽ hoạt động ok, vì 0.25 = 1/4 là công suất của 2. Trong mọi trường hợp khác, nó có thể không chính xác được thể hiện dưới dạng số điểm nổi. Một ví dụ về (tiềm năng) vấn đề:

for(double i = 0; i < 1.0; i += 0.1) 
    System.out.println(i); 

in 11 giá trị:

0.0 
0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 
+1

Câu hỏi ban đầu có 'i <10.0'. Bạn có thể giải thích một lần nữa cách nói tiêu chuẩn về bình đẳng dấu phẩy động được áp dụng ở đây không? (như một lưu ý, khi tính toán dấu phẩy động của bạn là chính xác, nó là hoàn toàn an toàn để sử dụng bình đẳng). –

+0

'khi tính toán điểm động của bạn là chính xác' là một câu khó.Bởi vì bạn phải chắc chắn rằng số thập phân của bạn thừa nhận một đại diện chính xác trong định dạng số nổi của Java (0.25 xảy ra để thừa nhận nó, 0,2 hoặc 0,1 không) Tôi đã thêm một ví dụ. – leonbloy

+0

Tôi đang cố gắng hiểu cách thêm 0,01 giúp. Nếu tính toán không chính xác, kết quả dấu phẩy động có khả năng thấp hơn kết quả thực như trên, vì vậy "sửa lỗi" của bạn có thể gây thêm một lần lặp trong vòng lặp đã có quá nhiều lần lặp so với ý định của người lập trình. –

2

Trong

for (double i = 0f; i < 10.0f; i +=0.25f) { 
System.out.println(i); 

f chỉ float

Các thêm = chỉ ra một shortcut cho tôi = i + 0,25;

0

Đối với số nguyên. Chúng ta có thể sử dụng: for (int i = 0; i < a.length; i += 2)

for (int i = 0; i < a.length; i += 2) { 
      if (a[i] == a[i + 1]) { 
       continue; 
      } 
      num = a[i]; 
     } 

Cùng cách chúng ta có thể làm cho các kiểu dữ liệu khác cũng có.

Các vấn đề liên quan