2012-10-31 69 views
5

Khi tôi cố gắng chia 1/60 hoặc 1/(60 * 60) nó cho 0. Ngay cả trong cửa sổ trình gỡ rối. Tôi là một chút bối rối những gì nó có thể được, bởi vì 2/3 hoặc 2,5/6 cho kết quả.C++. Chia 1 cho bất kỳ số nào cho 0

Mã của tôi:

int main() 
{ 
    double k1 = 1/60; 
    cout << k1 
     << endl; 
    double k2 = 1/(60*60); 
    cout << k2 
     << endl; 

    return 0; 
} 

Tôi đánh giá cao sự giúp đỡ của bạn.

+18

Nói xin chào cắt ngắn số nguyên. – chris

+0

@chris: quá nhanh! – Yamaneko

+2

@VictorHugo, loại tiêu đề đã cho nó đi. Tất nhiên điều đó có nghĩa là nó là một tiêu đề cực kỳ hay. – chris

Trả lời

9

Vì cả hai toán hạng của bạn là số nguyên, trình biên dịch thực hiện phân chia số nguyên tính toán phần thập phân). Nếu ít nhất một trong các toán hạng là một loại dấu phẩy động (như trong các ví dụ khác của bạn) thì một toán tử khác được thăng cấp và một phân chia dấu phẩy động được thực hiện.

Việc sửa chữa

Make ít nhất một trong các toán hạng của một loại dấu chấm động (double hoặc float); bạn có thể làm ví dụ này .:

  • làm cho nó một double đen (60 là số nguyên, hoặc thậm chí 60.060.double, 60.ffloat)
  • sử dụng một dàn diễn viên (double(60), (double)60).

Cá nhân tôi thích sử dụng trực tiếp double literals - không phải là các diễn viên có bất kỳ hình phạt hiệu suất trên các trình biên dịch nửa phong nha, nhưng nó cảm thấy "sai" và tiết đối với chỉ sử dụng một đen của đúng loại. (Rõ ràng là khi cả hai toán hạng là các biến và không literals bạn sử dụng các diễn viên)

phản đối Common

  • "nhưng tôi gán nó vào một double! "

    Nhiều người mới đang nhầm lẫn bởi thực tế này, vì họ nghĩ rằng gán kết quả vào một double nên có một số loại gợi ý để trình biên dịch. Trong thực tế, nó không phải.

    Tính toán/quảng cáo được thực hiện vào biểu thức là hoàn toàn độc lập từ loại đích đến, đây chỉ là bước cuối cùng. Các biểu thức con được đánh giá cho chúng là gì, không quan tâm đến kết quả sẽ được sử dụng như thế nào, vì vậy tất cả các loại chương trình khuyến mãi/hoạt động chỉ phụ thuộc vào loại toán hạng.

  • tại sao một người muốn chia số nguyên?

    Một số ngôn ngữ tự động thực hiện phân chia điểm nổi ngay cả khi đối số là cả hai số nguyên (ví dụ: VB6, IIRC), vì nó cảm thấy trực quan hơn cho người mới. Điều đó không giống như vậy trong C/C++: phân chia là không thể tách rời khi các đối số là số nguyên, vì trong nhiều trường hợp bạn không quan tâm đến số thập phân, và/hoặc nó thích hợp hơn vì lý do hiệu suất không sử dụng FPU (triết lý nền) trong C và C++ là "bạn không trả tiền cho những gì bạn không sử dụng"). Rõ ràng vấn đề có thể đã được giải quyết bằng cách sử dụng một toán tử riêng biệt cho bộ phận tách rời (VB, một lần nữa, sử dụng \), nhưng IMHO chúng ta có đủ toán tử trong C++ vì nó. :) góc


  1. Nitpickers': yes, đây thực sự nó là một khởi, không phải là một nhiệm vụ, nhưng chúng ta đang nói về cùng một loại quan niệm sai lầm.
  2. "chữ" là giá trị được bao gồm trong mã nguồn.
1

Mẫu số phải là số thập phân.

double k1 = 1/60.0; //Should work 

Nếu không, chương trình của bạn về cơ bản sẽ cắt ngắn tất cả các số thập phân.

EXTRA chút: Khi mẫu số của bạn là một biến, bạn phải bỏ nó:

double k2 = 1/(double)myDenom; 
+0

Ít nhất một trong tử số hoặc mẫu số phải là loại dấu phẩy động. Nó không phải là mẫu số: '1.0/60' cũng hoạt động tốt. –

+0

Ồ tôi có thể thề rằng nó phải là mẫu số. Đó là những gì tôi nhớ từ trường đại học năm trước. –

2

Dòng double k1 = 1/60 sẽ được đánh giá bởi trình biên dịch như một hằng số thời gian biên dịch. Vì không có '.0' ở cuối số, 1/60 sẽ được đánh giá qua phân chia số nguyên và do đó là 0.

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