2013-07-15 41 views
5

Tôi nghĩ logic của tôi là thiếu sót ....Thời gian ước tính còn lại, tôi còn thiếu gì?

trong một vòng lặp Tôi có:

int seconds = (int) (elapsed.TotalSeconds/ItemPos) * (Count - ItemPos); 

vòng lặp này cập nhật khoảng một lần mỗi giây ....

vấn đề tôi có được đó giây luôn kết thúc bằng giá trị 0 (0).

điều này là do giá trị ItemPos luôn cao hơn sau vòng lặp đầu tiên hơn elapsed.TotalSeconds.

Vì vậy, ví dụ:

nếu 3 giây vượt qua

ItemCount = 20 , so 3/20 = 0.15 - rounds to zero.... 0 * anything = 0...... 

Tôi đang làm gì sai?

+2

bộ phận đầu tiên của bạn được làm tròn đến 0. Cast các toán hạng để (float) đầu tiên. – EricLaw

+1

@EricLaw: TimeSpan.TotalSeconds là 'double' – dtb

+0

@EricLaw - rất hay ... Tôi sẽ thêm giải pháp ... –

Trả lời

6

phận Integer luôn trả về một int, và khi kết quả của bạn sẽ là 0.something, nó cắt xén để 0.

Làm một cái gì đó giá trị thực, và bạn đang sử dụng tốt. Hoặc, nhân trước khi chia:

int seconds = (int) ((float) elapsed.TotalSeconds/ItemPos) * (Count - ItemPos);

(Xem bên dưới)

hoặc

int seconds = (int) (elapsed.TotalSeconds * (Count - ItemPos)/ItemPos); 

EDIT

Dựa trên ý kiến ​​của DTB, tôi nhận ra tôi đặt định kiểu của tôi trong wrongplace. Dòng đầu tiên của tôi sẽ không hoạt động (mặc dù thứ hai của tôi vẫn sẽ). Điều đang xảy ra là bạn đang lấy giá trị kép từ TotalSeconds và chia nó cho int ItemPos để tăng gấp đôi. Nhưng sau đó bạn đang đúc nó vào một int, đó là nơi bạn nhận được nó thiết lập để 0. Như Henk Holterman nói, bạn cần phải bổ sung thêm ngoặc, do đó typecasting là trên toàn bộ bộ phận:

int seconds = (int) ((elapsed.TotalSeconds/ItemPos) * (Count - ItemPos)); 
+2

Không có phân chia số nguyên nào trong mã OP (giả sử rằng' elapsed' là một TimeSpan) . Vấn đề là vị trí của diễn viên '(int)'. – dtb

+2

Nếu bạn có một số không âm 'x' và số nguyên' y' trong đó 'x dtb

+0

@dtb Nghĩ về nó, bạn nói đúng. –

8

biểu hiện của bạn được hiểu là

((int)(elapsed.TotalSeconds/ItemPos)) * (Count - ItemPos); 

bạn phải trì hoãn việc loại đúc, tất cả bạn cần là một cặp thêm ():

//int seconds = (int) (elapsed.TotalSeconds/ItemPos) * (Count - ItemPos) ; 
    int seconds = (int) ((elapsed.TotalSeconds/ItemPos) * (Count - ItemPos)); 
Các vấn đề liên quan