Adakah yang tahu mengapa pembagian integer di C # mengembalikan integer dan bukan float? Apa ide di baliknya? (Apakah ini hanya warisan C / C ++?)
Dalam C #:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
Hasil dari kode ini adalah:
'Hello world'
Sebenarnya, tidak ada yang namanya pembagian bilangan bulat (pembagian menurut definisi adalah operasi yang menghasilkan bilangan rasional, bilangan bulat adalah subset yang sangat kecil.)
integer
divisi bukanfloating point
divisi.Jawaban:
Meskipun umum bagi programmer baru untuk melakukan kesalahan dalam melakukan pembagian integer ketika mereka sebenarnya dimaksudkan untuk menggunakan divisi floating point, dalam praktiknya divisi integer adalah operasi yang sangat umum. Jika Anda berasumsi bahwa orang jarang menggunakannya, dan bahwa setiap kali Anda melakukan pembagian, Anda harus selalu ingat untuk memberikan poin mengambang, Anda salah.
Pertama, pembagian integer sedikit lebih cepat, jadi jika Anda hanya perlu hasil bilangan bulat, Anda ingin menggunakan algoritma yang lebih efisien.
Kedua, ada sejumlah algoritma yang menggunakan pembagian integer, dan jika hasil pembagian selalu merupakan angka floating point Anda akan dipaksa untuk membulatkan hasil setiap waktu. Salah satu contoh dari bagian atas kepala saya adalah mengubah dasar angka. Menghitung setiap digit melibatkan pembagian bilangan bulat bersama dengan sisanya, bukan pembagian titik mengambang dari angka.
Karena alasan-alasan ini (dan yang terkait lainnya), pembagian integer menghasilkan integer. Jika Anda ingin mendapatkan pembagian floating point dari dua bilangan bulat, Anda hanya perlu mengingat untuk memasukkan satu ke
double
/float
/decimal
.sumber
/
operator akan melakukan pembagian integer atau floating point (kecuali jika Anda menggunakan dinamis). Jika sulit bagi Anda untuk mengetahuinya karena Anda melakukan begitu banyak pada satu baris, maka saya sarankan memecah garis itu menjadi beberapa baris sehingga lebih mudah untuk mengetahui apakah operan adalah bilangan bulat atau tipe floating point. Pembaca masa depan dari kode Anda akan sangat menghargainya.int/int
operator itu hanya ilegal [dengan diagnostik yang menetapkan bahwa kode harus melakukan operan atau menggunakan operator lain, tergantung pada perilaku mana yang diinginkan]. Jika ada beberapa urutan token lain yang tersedia untuk divisi integer, mungkin saja dapat mengurangi penggunaan/
untuk tujuan itu, tetapi saya tidak tahu apa yang praktis.Lihat spesifikasi C # . Ada tiga jenis operator divisi
Dalam kasus Anda, kami memiliki divisi Integer, dengan aturan berikut diterapkan:
Saya pikir alasan mengapa C # menggunakan jenis pembagian ini untuk bilangan bulat (beberapa bahasa mengembalikan hasil mengambang) adalah perangkat keras - divisi bilangan bulat lebih cepat dan lebih sederhana.
sumber
Setiap tipe data mampu membebani setiap operator. Jika pembilang dan penyebutnya bilangan bulat, tipe integer akan melakukan operasi pembagian dan itu akan mengembalikan tipe integer. Jika Anda ingin pembagian titik mengambang, Anda harus memasukkan satu atau lebih angka ke tipe titik mengambang sebelum membaginya. Misalnya:
atau, jika Anda menggunakan literal:
Perlu diingat, floating point tidak tepat. Jika Anda peduli tentang presisi, gunakan sesuatu seperti tipe desimal.
sumber
Karena Anda tidak menggunakan sufiks apa pun, literal
13
dan4
ditafsirkan sebagai bilangan bulat:Dengan demikian, karena Anda menyatakan
13
sebagai integer, pembagian integer akan dilakukan:Dan pembulatan terjadi:
Jika Anda melakukan hal berikut:
Anda akan menerima kesalahan kompilator, karena divisi floating-point (
/
operator dari13f
) menghasilkan float, yang tidak dapat dilemparkan ke int secara implisit.Jika Anda ingin divisi menjadi divisi floating-point, Anda harus menjadikan hasilnya sebagai float:
Perhatikan bahwa Anda masih akan membagi bilangan bulat, yang secara implisit akan dilemparkan ke float: hasilnya akan menjadi
3.0
. Untuk secara eksplisit mendeklarasikan operan sebagai float, menggunakanf
akhiran (13f
,4f
).sumber
1.0
.Ini hanya operasi dasar .
Ingatlah ketika Anda belajar membagi. Pada awalnya kami memecahkan
9/6 = 1 with remainder 3
./ -Operator dalam kombinasi dengan% -operator digunakan untuk mengambil nilai-nilai itu.
sumber
Mungkin bermanfaat:
sumber
2.5
, bukan2
.Hasilnya akan selalu bertipe yang memiliki rentang pembilang dan penyebut yang lebih besar. Pengecualiannya adalah byte dan pendek, yang menghasilkan int (Int32).
Tidak ada konversi implisit antara tipe floating-point dan tipe desimal, sehingga pembagian di antara mereka tidak diperbolehkan. Anda harus secara eksplisit melemparkan dan memutuskan mana yang Anda inginkan (Desimal memiliki lebih banyak presisi dan rentang yang lebih kecil dibandingkan dengan tipe floating-point).
sumber