Dalam kode kami, kami memiliki ganda yang perlu kami ubah menjadi int.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Adakah yang bisa menjelaskan mengapa i1 != i2
?
Hasil yang saya dapatkan adalah: i1 = 9
dan i2 = 8
.
Math.Truncate(score)
adalah niat yang lebih eksplisit diungkapkan daripada(int)score
Jawaban:
Karena
Convert.ToInt32
putaran:... sementara pemerannya memotong :
Pembaruan: Lihat komentar Jeppe Stig Nielsen di bawah ini untuk perbedaan tambahan (yang bagaimanapun tidak ikut bermain jika
score
bilangan real seperti yang terjadi di sini).sumber
score
ada,8.5
bukan8.6
. Saya memperbarui jawabannya dengan menyertakan kutipan. Terima kasih atas masukannya.score
adaNaN
atau suatu tak terhingga atau terbatas tetapi di luar kisaranInt32
, makaConvert.ToInt32
akan mengeluarkan pengecualian. Cast akan mengembalikanint
, tetapi Anda tidak akan tahu yang mana (dalam implementasi sayaInt32.MinValue
) karena Anda berada dalamunchecked
konteks. (Jika Anda berada dalamchecked
konteksnya, pemeran akan memberikan pengecualian juga dalam kasus ini.)Double
nomor jenis10000000000.6
(sepuluh miliar koma enam) adalah bilangan "nyata". Menggunakan cast keint
atas akan memberikan hasil yang aneh (kecuali Anda berada dalamchecked
konteksnya, tetapi mungkin tidak).Pengecoran akan mengabaikan apa pun setelah koma desimal, jadi 8,6 menjadi 8.
Convert.ToInt32(8.6)
adalah cara yang aman untuk memastikan penggandaan Anda dibulatkan ke bilangan bulat terdekat, dalam kasus ini 9.sumber
Anda dapat membulatkan double dan cast ist:
sumber
i1 == i2
. Pertanyaannya adalah mengapa mereka tidak setara. Suara negatif.Dalam contoh yang diberikan, desimal Anda adalah 8,6 . Jika 8,5 atau 9,5, pernyataan i1 == i2 mungkin benar. Faktanya itu akan benar untuk 8,5, dan salah untuk 9,5.
Penjelasan:
Terlepas dari bagian desimalnya, pernyataan kedua,
int i2 = (int)score
akan membuang bagian desimal dan hanya mengembalikan Anda bagian bilangan bulat. Hal yang cukup berbahaya untuk dilakukan, karena kehilangan data dapat terjadi.Nah, untuk pernyataan pertama, dua hal bisa terjadi. Jika bagian desimal adalah 5, yaitu setengah jalan, keputusan harus dibuat. Apakah kita membulatkan ke atas atau ke bawah? Di C #, kelas Convert mengimplementasikan pembulatan bankir. Lihat jawaban ini untuk penjelasan lebih dalam. Sederhananya, jika angkanya genap, bulatkan ke bawah, jika angkanya ganjil, bulatkan ke atas.
Misalnya Pertimbangkan:
sumber
ToInt32 putaran. Casting ke int hanya membuang komponen non-integer.
sumber