Làm thế nào để phân chia 2 int tạo ra một float thay vì int int khác?


149

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

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

float v = s / t thực hiện phép chia sau đó biến kết quả thành float. float v = (float) s / t phôi để float sau đó thực hiện phép chia.
Juan Carlos Iturriagagoitia

Câu trả lời:


307

Chỉ cần đặt một trong hai toán hạng lên một dấu phẩy trước.

v = (float)s / t;

Các diễn viên có quyền ưu tiên cao hơn so với phân chia, vì vậy xảy ra trước khi phân chia.

Toán hạng khác sẽ được trình biên dịch tự động chuyển thành float một cách hiệu quả bởi vì các quy tắc nói rằng nếu một toán hạng là loại dấu phẩy động thì hoạt động sẽ là một phép toán dấu phẩy động, ngay cả khi toán hạng khác là tích phân. Đặc tả ngôn ngữ Java, §4.2.4§15.17


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

Cụ thể hơn, quy tắc cụ thể này được đề cập ở đây: Toán tử nhân , vì vậy hãy để nó đứng ở đây để tham khảo trong tương lai.
lượng tử

5
(Đối với bất cứ ai đi ngang qua câu hỏi này sau, các liên kết nhất định được phá vỡ Những người mới là:. Docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4tài liệu. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley

13

Thử:

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

Đúc ints cho phao sẽ cho phép phân chia điểm nổi diễn ra.

Bạn thực sự chỉ cần bỏ một, mặc dù.


Tôi không biết, nó giống như nói rằng bạn nên sử dụng lâu dài thay vì iof ints.
Jakub Zaverka

4

Truyền một trong các số nguyên sang một số float để buộc phép toán được thực hiện với phép toán dấu phẩy động. Nếu không thì toán nguyên luôn được ưu tiên. Vì thế:

v = (float)s / t;


3

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

Các hoạt động int thường trả về int, vì vậy bạn phải thay đổi một trong các số toán hạng.


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

3

Bạn có thể sử dụng ngay cả một trong số chúng, nhưng để thống nhất bạn có thể muốn sử dụng cả hai cách rõ ràng để một cái gì đó như v = (float) s / (float) t sẽ hoạt động.


1

Tiêu chuẩn JLS

JLS 7 15.17.2. Người điều hành bộ phận / nói:

Phép chia số nguyên làm tròn về 0. Nghĩa là thương số được tạo cho toán hạng n và d là số nguyên sau khi thăng cấp số nhị phân (§5.6.2) là một giá trị nguyên q có độ lớn càng lớn càng tốt trong khi thỏa mãn | d · q | ≤ | n |. Hơn nữa, q dương khi | n | ≥ | d | và n và d có cùng dấu, nhưng q âm khi | n | ≥ | d | và n và d có dấu hiệu trái ngược nhau.

Đây là lý do tại sao 1/2không cho một float.

Chuyển đổi chỉ một trong hai để nổi như trong (float)1/2đủ vì 15,17. Toán tử nhân nói:

Quảng cáo số nhị phân được thực hiện trên các toán hạng

5.6.2. Khuyến mãi số nhị phân cho biết:

  • Nếu một trong hai toán hạng là loại đôi, thì toán hạng kia được chuyển đổi thành gấp đôi.
  • Mặt khác, nếu một trong hai toán hạng là kiểu float, thì toán hạng kia được chuyển đổi thành float

0

Truyền một trong các số nguyên / cả hai số nguyên để thả nổi để buộc phép toán được thực hiện với phép toán dấu phẩy động. Mặt khác, toán học số nguyên luôn được ưu tiên. Vì thế:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.