Perte possible de fraction

119

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 entier dans l'objet.

Je reçois un message indiquant une perte possible de fraction. Cependant, lorsque je change le double en un int, le message disparaît.

Des pensées sur pourquoi cela arriverait?

CodeLikeBeaker
la source
Merci à tous pour les excellentes réponses. Il est maintenant logique que vous perdiez le point décimal lors de la division de 2 valeurs int.
CodeLikeBeaker

Réponses:

168

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

Par exemple, transformez 10 en 10,0

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

Vous faites une division entière si myObject.Valueest un entier , puisque 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;
lc.
la source
7

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

Cambium
la source
7

En supposant qu'il myObject.Values'agit d'un int, l'équation myObject.Value / 10sera une division entière qui sera ensuite convertie en double.

Cela signifie que myObject.Value étant égal à 12, returnValue deviendra 1, et non 1,2.

Vous devez d'abord convertir la ou les valeurs:

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

Cela aboutirait à la valeur correcte 1.2, au moins aussi correcte que les doubles le permettent compte tenu de leurs limites, mais cela est discuté ailleurs sur SO, presque à l'infini :-).

paxdiablo
la source
4

Je pense que puisque myObject est un int, vous devriez

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