confusione static_cast causata da incoerenze
Domanda
Perché ogni volta che compilo ed eseguo il seguente codice in Visual Studio 2008:
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2;
Console::WriteLine(whole_number);
Ottengo un valore errato di 26 mentre la risposta è 25.
Comunque quando uso i cast statici sui doppi, ottengo la risposta giusta che è 25.
Come si può spiegare l'output sbagliato?
Soluzione
È assolutamente giusto.
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2; // int whole_number = 26.0;
Console::WriteLine(whole_number);
Cosa ti aspetteresti invece? Il compilatore valuta prima il lato destro, quindi si converte implicitamente nell'int. Pertanto, 26.0
diventa 26
Quando esegui il cast prima di aggiungere, aggiungerai 10
e 15
, che risulta in 25
:)
Altri suggerimenti
In realtà, non è possibile fare affidamento sui numeri in virgola mobile per arrotondare in entrambi i modi quando si esegue una conversione automatica. Se 26.0 è rappresentato da 26.00005, sarà arrotondato a 26, se è rappresentato da 25.999995, sarà arrotondato a 25. Se si desidera essere sicuri, utilizzare la funzione C standard round
, definita in math.h
. Dire Pertanto, 26.0 diventa 26 non è del tutto corretto.