Bagaimana membuat pembagian 2 int menghasilkan float, bukan int lainnya?


149

Dalam latihan Bruce Eckels lain dalam menghitung kecepatan, di v = s / tmana s dan t adalah bilangan bulat. Bagaimana cara membuatnya sehingga divisi ini bisa mengapung?

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 melakukan pembagian kemudian mentransformasikan hasilnya menjadi float. float v = (float) s / t cast untuk float kemudian melakukan pembagian.
Juan Carlos Iturriagagoitia

Jawaban:


307

Hanya melemparkan salah satu dari dua operan ke pelampung terlebih dahulu.

v = (float)s / t;

Para pemain memiliki prioritas lebih tinggi daripada divisi, jadi terjadi sebelum pembagian.

Operan lain akan secara otomatis dilemparkan ke float oleh kompiler karena aturan mengatakan bahwa jika salah satu operand adalah tipe floating point maka operasi akan menjadi operasi floating point, bahkan jika operan lainnya integral. Spesifikasi Bahasa Jawa, §4.2.4 dan §15.17


8
Grrr, ini membutuhkan waktu sekitar 30 menit sampai saya menemukan ini dan menemukan jawabannya. Sangat sederhana. : D
Rihards

Lebih khusus, aturan khusus ini disebutkan di sini: Operator Multiplikatif , jadi biarkan di sini untuk referensi di masa depan.
kuantum

5
(Untuk siapa pun yang menemukan pertanyaan ini nanti, tautan yang diberikan terputus. Yang baru adalah: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 dan dokumen. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley

13

Mencoba:

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

Membuat int untuk mengapung akan memungkinkan pembagian titik-mengambang terjadi.

Anda benar-benar hanya perlu melemparkan satu.


Saya tidak tahu, ini seperti mengatakan bahwa Anda harus menggunakan long sebagai ganti int.
Jakub Zaverka

4

Keluarkan salah satu bilangan bulat ke pelampung untuk memaksa operasi dilakukan dengan matematika floating point. Kalau tidak, bilangan bulat matematika selalu lebih disukai. Begitu:

v = (float)s / t;


3

Anda dapat menggunakan pembilang atau penyebut untuk mengap ...

operasi int biasanya mengembalikan int, jadi Anda harus mengubah salah satu nomor operan.


1
Biasanya? Jika mereka kembali sama sekali, mereka akan kembali int.
Matthew Flaschen

3

Anda dapat melemparkan bahkan hanya salah satu dari mereka, tetapi untuk konsistensi Anda mungkin ingin melemparkan keduanya secara eksplisit sehingga sesuatu seperti v = (float) s / (float) t harus bekerja.


1

JLS Standard

JLS 7 15.17.2. Operator Divisi / mengatakan:

Putaran pembagian bilangan bulat ke arah 0. Yaitu, hasil bagi yang diproduksi untuk operan n dan d yang bilangan bulat setelah promosi numerik biner (§5.6.2) adalah nilai integer q yang besarnya sebesar mungkin sambil memuaskan | d · q | ≤ | n |. Selain itu, q bernilai positif ketika | n | ≥ | d | dan n dan d memiliki tanda yang sama, tetapi q negatif ketika | n | ≥ | d | dan n dan d memiliki tanda-tanda yang berlawanan.

Inilah sebabnya mengapa 1/2tidak memberikan pelampung.

Konversi salah satu saja agar mengambang seperti (float)1/2memadai karena 15.17. Operator Multiplikatif mengatakan:

Promosi numerik biner dilakukan pada operan

dan 5.6.2. Binary Numeric Promotion mengatakan:

  • Jika salah satu operan bertipe ganda, yang lain dikonversi menjadi ganda.
  • Kalau tidak, jika salah satu operan adalah tipe float, yang lain dikonversi menjadi float

0

Keluarkan salah satu bilangan bulat / kedua bilangan bulat ke float untuk memaksa operasi dilakukan dengan floating point Math. Kalau tidak, bilangan bulat Matematika selalu lebih disukai. Begitu:

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

0

Coba ini:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.