web-dev-qa-db-fra.com

Perte de fraction possible

Pardonnez-moi si c'est une question naïve, mais je suis perdu aujourd'hui.

J'ai un calcul de division simple comme suit:

double returnValue = (myObject.Value / 10);

La valeur est un int dans l'objet.

Je reçois un message qui dit Perte de fraction possible. Cependant, lorsque je change le double en int, le message disparaît.

Avez-vous des raisons de penser que cela se produirait?

114
CodeLikeBeaker

Lorsque vous divisez deux int en une valeur à virgule flottante, la partie fraction est perdue. Si vous lancez l'un des éléments sur un flotteur, vous n'obtiendrez pas cette erreur.

Ainsi, par exemple, transformer 10 en 10,0

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

Vous faites une division entière si myObject.Value est un entier, car les deux côtés du / sont de type entier.

Pour effectuer une division en virgule flottante, l'un des nombres de l'expression doit être de type virgule flottante. Ce serait vrai si myObject.Value était un double ou l'un des éléments suivants:

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;
57
lc.

Un entier divisé par un entier renverra votre entier. Convertissez la valeur en double ou divisez par 10,0.

7
Cambium

En admettant que myObject.Value est un int, l'équation myObject.Value / 10 sera une division entière qui sera ensuite convertie en double.

Cela signifie que myObject.Value étant 12, la valeur returnValue deviendra 1, pas 1.2.

Vous devez d'abord convertir la ou les valeurs:

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

Cela se traduirait par la valeur correcte de 1,2, au moins aussi correcte que les doubles le permettront compte tenu de leurs limites, mais cela est discuté ailleurs sur SO, presque sans fin :-).

7
paxdiablo

Je pense que puisque myObject est un int, vous devriez

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