Possibile perdita di frazione


119

Perdonami se questa è una domanda ingenua, tuttavia oggi sono perplesso.

Ho un semplice calcolo della divisione come segue:

double returnValue = (myObject.Value / 10);

Il valore è un int nell'oggetto.

Ricevo un messaggio che dice Possibile perdita di frazione. Tuttavia, quando cambio il double in un int, il messaggio scompare.

Qualche idea sul perché questo sarebbe accaduto?


Grazie a tutti per le ottime risposte. Ha senso ora che si perde il punto decimale quando si dividono 2 valori int.
CodeLikeBeaker

Risposte:


168

Quando dividi due int in un valore in virgola mobile, la parte della frazione viene persa. Se lanci uno degli oggetti su un galleggiante, non otterrai questo errore.

Quindi, ad esempio, trasforma 10 in 10.0

double returnValue = (myObject.Value / 10.0);

57

Stai eseguendo la divisione intera se myObject.Valueè un int, poiché entrambi i lati di /sono di tipo intero.

Per eseguire la divisione in virgola mobile, uno dei numeri nell'espressione deve essere di tipo a virgola mobile. Ciò sarebbe vero se myObject.Value fosse un doppio o uno dei seguenti:

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

Un numero intero diviso per un numero intero restituirà un numero intero. Lancia Value a un doppio o dividi per 10.0.


7

Supponendo che myObject.Valuesia an int, l'equazione myObject.Value / 10sarà una divisione intera che verrà quindi convertita in un doppio.

Ciò significa che myObject.Value essendo 12 comporterà che returnValue diventi 1, non 1.2.

Devi prima lanciare il valore (i):

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

Ciò risulterebbe nel valore corretto 1.2, corretto almeno quanto i doppi permetteranno dati i loro limiti, ma questo è discusso altrove su SO, quasi all'infinito :-).


4

Penso che poiché myObject è un int, dovresti

double returnValue=(myObject.Value/10.0); 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.