confusão static_cast causada por inconsistências
Pergunta
Por que sempre que eu compilar e executar o seguinte código no Visual Studio 2008:
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2;
Console::WriteLine(whole_number);
Eu recebo um valor incorreto de 26, enquanto a resposta é 25.
No entanto, quando eu uso moldes estáticos nas duplas, recebo a resposta certa, que é de 25.
Como pode a saída errada ser explicado?
Solução
É absolutamente certo.
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2; // int whole_number = 26.0;
Console::WriteLine(whole_number);
O que você espera em vez disso? O compilador primeiro avalia o lado direito, e, em seguida, implicitamente converte ao int. Assim, torna-se 26.0
26
Quando você lança antes de adicionar, então você está indo para adicionar 10
e 15
, o que resulta em 25
:)
Outras dicas
Na verdade, você não pode confiar em números de ponto flutuante para rodada de qualquer forma ao fazer uma conversão automática. Se 26,0 é representado por 26,00005, ele será arredondado para 26, se ele é representado por 25,999995, ele será arredondado para 25. Se você quer ter certeza, use o round
função C padrão, definido no math.h
. Dizendo Assim, 26,0 torna-se 26 não é totalmente correcta.