2012-12-02 31 views
14

Khi tôi chia 317 của 219 trong Java sử dụng đôi tôi nhận được 1.
Ví dụ:hành vi Odd khi chia đôi trong Java

double b = 317/219; 
System.out.println(b); 

Output là: 1.

Đây có phải là bởi vì nó được một số thập phân định kỳ? Đã phải sử dụng BigDecimal thay vì đó là gây phiền nhiễu.

+0

đầu ra sẽ là 1.0 để chính xác hơn –

+0

Bản sao có thể có của [Phân tách số nguyên Java: Ho w để bạn tạo ra một đôi?] (http: // stackoverflow.com/questions/3144610/java-integer-division-how-do-bạn-sản xuất-a-double). Tôi đã lựa chọn, nhưng câu hỏi này được hỏi quá nhiều lần trên SO. – demongolem

Trả lời

22

Hãy thử loại

double b = 317/219D; 

Giá trị mặc định này số mã trong java là int, như vậy với các mã như bạn có nó java đang làm việc với hai int số và kết quả của việc phân chia sau đó cũng sẽ là int, sẽ cắt ngắn phần thập phân để đưa ra kết quả cuối cùng là 1. Sau đó, kết quả int này được truyền từ int 1 đến double 1 mà không có cảnh báo trình biên dịch vì đó là việc mở rộng mở rộng (một nơi mà loại nguồn được đảm bảo "vừa" thành loại mục tiêu).

Bằng cách mã hóa một trong những con số như double với trailing D (bạn cũng có thể sử dụng d, nhưng tôi luôn luôn sử dụng chữ cái viết hoa vì L như chữ thường l trông giống như một 1), kết quả của việc phân chia sẽ double quá .

+1

Hầu hết các câu trả lời khác chỉ cần gắn '.0' để buộc số học dấu chấm động (gấp đôi), nhưng câu trả lời này cho biết rõ ràng cả hai toán hạng là loại gấp đôi; một điểm tinh tế nhưng quan trọng! –

+0

Tôi chắc chắn tôi đã cố gắng đúc để tăng gấp đôi! Đoán tôi chỉ là ngu ngốc. Cảm ơn đã giúp đỡ! – Joe

3

Điều này là do bạn đã sử dụng các chữ số nguyên, do đó bạn đang thực hiện phân chia số nguyên.

Thay vào đó hãy thử viết double b = 317.0/219.0;.

0

Đây là số int chia. Viết:

double b = 317.0/219; 
System.out.println(b); 
0

vì các số bạn đặt là inetgers nên đây là câu trả lời.
để có được đôi bạn cần hoặc sử dụng một số với dấu chấm động hoặc bỏ một trong những nguyên bạn sử dụng:

double b = 317.0/219; 
System.out.println(b); 

hay:

double b = ((double)317)/219; 
System.out.println(b); 
2

Điều đáng nói là không có bộ phận trong ví dụ của bạn khi chạy. 317/219 được tính tại thời gian biên dịch (phân chia số nguyên, phân số được loại bỏ) và được thay thế bằng hằng số. Nếu bạn dịch ngược .class (tôi đã sử dụng Jad http://www.kpdus.com/jad.html) bạn sẽ thấy

double b = 1.0D; 
5

Một lựa chọn khác ...

double b = (double)317/219; 
-2

Bạn có thể thử

double b = 0.0; 
b = 317/219; 

để tôi có thể trả lại số thập phân điểm

+0

Đây không phải là câu trả lời đúng. cả 317 và 219 là int do đó kết quả sẽ là phần int của bộ phận không quan trọng kiểu tham số là gì. – zohar

+0

Có thể có nhiều điều bạn có thể thử khác hơn ở trên. Tuy nhiên @Joe đã gặp khó khăn trong việc hiểu cách thức các công cụ arithmatic hoạt động trong Java. Đây không phải là một câu trả lời nào cả. – prageeth

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