Kemungkinan Kehilangan Pecahan

119

Maafkan saya jika ini adalah pertanyaan yang naif, namun saya bingung hari ini.

Saya memiliki perhitungan pembagian sederhana seperti berikut:

double returnValue = (myObject.Value / 10);

Nilai adalah int di objek.

Saya mendapatkan pesan yang mengatakan Kemungkinan Kehilangan Pecahan. Namun, ketika saya mengubah double menjadi int, pesannya hilang.

Adakah pemikiran tentang mengapa ini terjadi?

CodeLikeBeaker
sumber
Terima kasih atas tanggapan yang luar biasa. Masuk akal sekarang bahwa Anda kehilangan koma desimal saat membagi 2 nilai int.
CodeLikeBeaker

Jawaban:

168

Saat Anda membagi dua int menjadi nilai floating point, bagian pecahannya hilang. Jika Anda melemparkan salah satu item ke float, Anda tidak akan mendapatkan kesalahan ini.

Jadi misalnya ubah 10 menjadi 10.0

double returnValue = (myObject.Value / 10.0);
Ólafur Waage
sumber
57

Anda melakukan pembagian integer jika myObject.Valueint, karena kedua sisi /bertipe integer.

Untuk melakukan pembagian floating-point, salah satu bilangan dalam ekspresi harus berjenis floating-point. Itu akan benar jika myObject.Value adalah ganda, atau salah satu dari berikut ini:

double returnValue = myObject.Value / 10.0;
double returnValue = myObject.Value / 10d; //"d" is the double suffix
double returnValue = (double)myObject.Value / 10;
double returnValue = myObject.Value / (double)10;
lc.
sumber
7

Integer yang dibagi dengan integer akan mengembalikan integer Anda. Transmisikan Value menjadi double atau bagi dengan 10.0.

Cambium
sumber
7

Dengan asumsi itu myObject.Valueadalah int, persamaan myObject.Value / 10akan menjadi pembagian bilangan bulat yang kemudian akan dilemparkan menjadi ganda.

Itu berarti myObject.Value menjadi 12 akan menghasilkan returnValue menjadi 1, bukan 1,2.

Anda perlu memasukkan nilainya terlebih dahulu:

double returnValue = (double)(myObject.Value) / 10.0;

Ini akan menghasilkan nilai 1.2 yang benar, setidaknya sama benarnya dengan double karena keterbatasannya tetapi itu dibahas di tempat lain di SO, hampir tanpa akhir :-).

paxdiablo
sumber
4

Saya pikir karena myObject adalah int, Anda harus melakukannya

double returnValue=(myObject.Value/10.0); 
segfault
sumber