2009-06-30 18 views
100

Perdonami se questa è una domanda ingenua, tuttavia oggi sono in perdita.Possibile perdita di frazione

Ho un semplice calcolo divisione come segue:

double returnValue = (myObject.Value/10); 

Value è un int nell'oggetto.

Viene visualizzato un messaggio che indica Possibile perdita di frazione. Tuttavia, quando cambio il doppio in un int, il messaggio scompare.

Qualche idea sul perché questo potrebbe accadere?

+0

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

risposta

138

Quando si divide due int di in un valore in virgola mobile alla porzione frazione è perso. Se lanci uno degli oggetti su un float, non otterrai questo errore.

Così, per esempio trasformare 10 in un 10,0

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

Credo che dal momento myObject è un int, si dovrebbe

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

si sta facendo divisione intera se myObject.Value è un int, dal momento che entrambi i lati del / sono di tipo intero.

Per eseguire la divisione in virgola mobile, uno dei numeri nell'espressione deve essere di tipo in virgola mobile. Questo sarebbe vero se myObject.Value fosse un doppio, o di una qualsiasi delle 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; 
6

Un numero intero diviso per un numero intero restituirà il vostro un intero. Castare Valore su un doppio o dividere per 10.0.

6

Supponendo che myObject.Value è un int, l'equazione myObject.Value/10 sarà una divisione intera che verrà poi gettato in doppio.

Ciò significa che myObject.Value 12 sarà restituito come valore 1, non 1.2.

È necessario cast del valore (s) prima:

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

Questo comporterebbe il valore corretto 1.2, almeno per quanto corretta come doppie permetterà dato i loro limiti, ma questo è discusso altrove su SO, quasi infinitamente :-).