Untuk blok kode ini:
int num = 5;
int denom = 7;
double d = num / denom;
nilai d
is 0.0
. Itu bisa dipaksa untuk bekerja dengan casting:
double d = ((double) num) / denom;
Tetapi apakah ada cara lain untuk mendapatkan double
hasil yang benar ? Saya tidak suka casting primitif, siapa yang tahu apa yang mungkin terjadi.
java
casting
integer-division
buah kenari
sumber
sumber
Jawaban:
Itu menghindari gips. Tetapi Anda akan menemukan bahwa konversi pemeran didefinisikan dengan baik. Anda tidak perlu menebak, cukup periksa JLS . int to double adalah konversi pelebaran. Dari §5.1.2 :
5 dapat diekspresikan tepat sebagai ganda.
sumber
1.0
masih mengubah jenis hasilnya, hanya dengan cara yang berbeda. 'Sepertinya kode kotor bagi saya' tidak menjelaskan dalam skenario apa Anda yakin mengalikan dengan1.0
sebenarnya lebih baik (atau mengapa itu mungkin).(double)num
perubahan entah bagaimananum
. Tidak - itu menciptakan dobel sementara untuk konteks pernyataan itu.Apa yang salah dengan casting primitif?
Jika Anda tidak ingin melakukan casting karena alasan tertentu, Anda bisa melakukannya
sumber
double d = num * 1D / denom;
Mengapa Anda memiliki rasa takut yang irasional terhadap pemeran primitif? Tidak ada yang buruk akan terjadi ketika Anda melemparkan
int
kedouble
. Jika Anda tidak yakin bagaimana cara kerjanya, cari di Spesifikasi Bahasa Jawa . Castingint
to todouble
adalah konversi primitif yang melebar .Anda dapat menyingkirkan pasangan kurung tambahan dengan melemparkan penyebut alih-alih pembilang:
sumber
double d = (double) num / denom;
... (OK, yang ini tergantung pada diutamakan)Jika Anda mengubah jenis satu variabel Anda harus ingat untuk menyelinap di ganda lagi jika rumus Anda berubah, karena jika variabel ini berhenti menjadi bagian dari perhitungan, hasilnya kacau. Saya membuat kebiasaan casting dalam perhitungan, dan menambahkan komentar di sebelahnya.
Perhatikan bahwa casting hasilnya tidak akan berhasil
sumber
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:
Perhatikan bahwa casting hasilnya tidak akan berhasil. Karena pembagian pertama dilakukan sesuai aturan diutamakan.
Saya tidak berpikir ada masalah dengan casting seperti yang Anda pikirkan.
sumber
Tipe Casting Adalah Satu-Satunya Cara
Memproduksi
double
dari divisi integer - tidak ada cara lain tanpa casting (mungkin Anda tidak akan melakukannya secara eksplisit tetapi itu akan terjadi).Sekarang, ada beberapa cara kita dapat mencoba untuk mendapatkan yang tepat
double
nilai (di mananum
dandenom
adalahint
jenis, dan dari-kursus dengan pengecoran ) -dengan casting eksplisit:
double d = (double) num / denom;
double d = ((double) num) / denom;
double d = num / (double) denom;
double d = (double) num / (double) denom;
tapi tidak
double d = (double) (num / denom);
dengan casting implisit:
double d = num * 1.0 / denom;
double d = num / 1d / denom;
double d = ( num + 0.0 ) / denom;
double d = num; d /= denom;
tapi tidak
double d = num / denom * 1.0;
dan tidak
double d = 0.0 + ( num / denom );
sumber
gunakan sesuatu seperti:
(1d adalah gips untuk menggandakan)
sumber
Anda mungkin mempertimbangkan untuk mengakhiri operasi. Sebagai contoh:
Ini memungkinkan Anda untuk melihat ke atas (sekali saja) apakah para pemain melakukan apa yang Anda inginkan. Metode ini juga dapat diuji, untuk memastikan bahwa ia terus melakukan apa yang Anda inginkan. Juga tidak masalah trik apa yang Anda gunakan untuk menyebabkan pembagian (Anda bisa menggunakan salah satu jawaban di sini), selama itu menghasilkan hasil yang benar. Di mana pun Anda perlu membagi dua bilangan bulat, Anda sekarang dapat menelepon
Utils::divide
dan percaya bahwa itu melakukan hal yang benar.sumber
gunakan saja ini.
sumber
Cara terbaik untuk melakukan ini adalah
sumber