2009-04-24 36 views
101

Trong bài tập Bruce Eckels khác trong tính toán vận tốc, v = s/t trong đó s và t là số nguyên. Làm thế nào để tôi làm cho nó để phân chia cranks ra một phao?Làm thế nào để phân chia 2 int tạo ra một phao thay vì một int khác?

class CalcV { 
    float v; 
    float calcV(int s, int t) { 
    v = s/t; 
    return v; 
    } //end calcV 
} 

public class PassObject { 

    public static void main (String[] args) { 
    int distance; 
    distance = 4; 

    int t; 
    t = 3; 

    float outV; 

    CalcV v = new CalcV(); 
    outV = v.calcV(distance, t); 

    System.out.println("velocity : " + outV); 
    } //end main 
}//end class 

Trả lời

219

Chỉ cần chuyển một trong hai toán hạng sang phao trước.

v = (float)s/t; 

Dàn diễn viên có quyền ưu tiên cao hơn phân chia, vì vậy sẽ xảy ra trước khi chia. Các toán hạng khác sẽ tự động được cast một cách hiệu quả vào trình float bởi vì các quy tắc nói rằng nếu toán hạng là kiểu dấu phẩy động thì thao tác sẽ là một phép toán dấu phẩy động, ngay cả khi toán hạng còn lại là không thể tách rời. Java Language Specification, §4.2.4§15.17

+7

Grrr, điều này đã cho tôi khoảng 30 phút cho đến khi tôi thấy điều này và đã tìm nó ra. Quá dễ. : D – Rihards

+0

Cụ thể hơn, quy tắc cụ thể này được đề cập ở đây: [Phép toán nhân] (http://java.sun.com/docs/books/jls/third%5Fedition/html/expressions.html#239829), vì vậy hãy để nó đứng ở đây để tham khảo trong tương lai. – quantum

+5

(Đối với bất kỳ ai đến qua câu hỏi này sau, các liên kết đã cho bị hỏng. Các liên kết mới là: http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2 .4 và http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17) –

2

Bạn có thể đúc tử số hoặc mẫu số nổi ...

int hoạt động thường trở int, vì vậy bạn phải thay đổi một trong những con số operanding.

+1

Thông thường? Nếu họ quay trở lại, họ sẽ quay lại int. –

9

Hãy thử:

v = (float)s/(float)t; 

Đúc ints để nổi sẽ cho phép bộ phận dấu chấm động sẽ diễn ra.

Bạn thực sự chỉ cần truyền một trang.

+0

Tôi không biết, nó giống như nói rằng bạn nên sử dụng longs thay vì iof ints. –

3

Truyền một trong các số nguyên sang phao để bắt buộc thực hiện thao tác với phép tính dấu chấm động. Nếu không thì toán học số nguyên luôn được ưu tiên. Vì vậy:

v = (float)s/t; 
3

Bạn có thể đúc thậm chí chỉ cần một trong số họ, nhưng đối với quán bạn có thể muốn một cách rõ ràng đúc cả nên cái gì như v = (float) s/(float) t nên làm việc.

4

Để giảm bớt các tác động trên mã readabilty, tôi muốn đề nghị:

v = 1d* s/t; 
0

Cast một trong những nguyên/cả hai số nguyên nổi để buộc các hoạt động được thực hiện với điểm nổi Math. Nếu không, số nguyên Toán luôn được ưu tiên. Vì vậy:

1. v = (float)s/t; 
2. v = (float)s/(float)t; 
0

JLS Chuẩn

JLS 7 15.17.2. Division Operator / nói:

Phép chia số nguyên làm tròn về 0.

Đây là lý do tại sao 1/2 không đưa ra một phao.

Chuyển đổi chỉ một trong hai nổi như trong (float)1/2 cũng đủ vì 15.17. Multiplicative Operators nói:

Binary khuyến mãi số được thực hiện trên các toán hạng

5.6.2. Binary Numeric Promotion nói:

  • Nếu toán hạng là loại gấp đôi, thì toán tử còn lại là chuyển đổi erted tăng gấp đôi.
  • Ngược lại, nếu một trong hai toán hạng là kiểu float, người kia được chuyển thành nổi
0

Hãy thử điều này:

class CalcV 
{ 
     float v; 
     float calcV(int s, int t) 
     { 
      float value1=s; 
      float value2=t; 
      v = value1/value2; 
      return v; 
     } //end calcV 
} 
Các vấn đề liên quan