Olası Kesir Kaybı


119

Bu saf bir soruysa beni affet, ancak bugün bir kaybım var.

Aşağıdaki gibi basit bir bölme hesaplamam var:

double returnValue = (myObject.Value / 10);

Değer, nesnedeki bir int'dir.

Olası Kesir Kaybı yazan bir mesaj alıyorum. Bununla birlikte, double'ı int olarak değiştirdiğimde mesaj kaybolur.

Bunun neden olacağına dair herhangi bir fikriniz var mı?


Harika yanıtlar için hepinize teşekkür ederim. 2 int değerini bölerken ondalık noktayı kaybetmeniz artık mantıklı.
CodeLikeBeaker

Yanıtlar:


168

İki int'i bir kayan nokta değerine böldüğünüzde kesir kısmı kaybolur. Öğelerden birini bir şamandıraya atarsanız, bu hatayı almazsınız.

Örneğin, 10'u 10.0'a çevirin

double returnValue = (myObject.Value / 10.0);

57

Tamsayı bölme yaparsınız, eğer myObject.Valuebir tamsayı ise , her iki tarafı /da tamsayı türündedir.

Kayan noktalı bölme yapmak için, ifadedeki sayılardan birinin kayan nokta türünde olması gerekir. MyObject.Value bir çift veya aşağıdakilerden herhangi biri olsaydı bu doğru olurdu:

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;

7

Tamsayıya bölünen bir tam sayı, bir tamsayınızı döndürür. Değeri ikiye katlayın veya 10.0'a bölün.


7

Varsayarak myObject.Valuebir olduğu int, denklem myObject.Value / 10sonra çift dönüştürülmeyecektir bir tamsayı bölme olacaktır.

Bu, myObject.Value değerinin 12 olmasının returnValue değerinin 1.2 değil 1 olacağı anlamına gelir .

Önce değerleri atmanız gerekir:

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

Bu, en azından iki katının sınırlamaları göz önüne alındığında izin verdiği kadar doğru olan 1.2'nin doğru değeriyle sonuçlanacaktır, ancak bu, SO'da neredeyse sonsuza dek tartışılan :-).


4

MyObject bir int olduğundan,

double returnValue=(myObject.Value/10.0); 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.