Possível perda de fração


119

Perdoe-me se esta é uma pergunta ingênua, mas estou perdida hoje.

Eu tenho um cálculo de divisão simples, como a seguir:

double returnValue = (myObject.Value / 10);

Valor é um int no objeto.

Estou recebendo uma mensagem que diz Possível perda de fração. No entanto, quando altero o dobro para um int, a mensagem desaparece.

Alguma idéia de por que isso aconteceria?


Obrigado a todos pelas ótimas respostas. Faz sentido agora que você perde o ponto decimal ao dividir 2 valores int.
CodeLikeBeaker

Respostas:


168

Quando você divide dois int em um valor de ponto flutuante, a parte da fração é perdida. Se você converter um dos itens para um flutuador, não receberá esse erro.

Por exemplo, transforme 10 em uma 10.0

double returnValue = (myObject.Value / 10.0);

57

Você está fazendo divisão inteira se myObject.Valuefor um int, pois os dois lados do /são do tipo inteiro.

Para fazer a divisão de ponto flutuante, um dos números na expressão deve ser do tipo de ponto flutuante. Isso seria verdade se myObject.Value fosse duplo ou qualquer um dos seguintes:

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

Um número inteiro dividido por um número inteiro retornará um número inteiro. Converta Valor para um dobro ou divida por 10,0.


7

Supondo que myObject.Valueseja um int, a equação myObject.Value / 10será uma divisão inteira que será convertida em um dobro.

Isso significa que myObject.Value sendo 12 resultará em returnValue se tornando 1, e não 1.2.

Você precisa converter os valores primeiro:

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

Isso resultaria no valor correto 1.2, pelo menos o mais correto possível, dadas as limitações, mas isso é discutido em outro lugar no SO, quase infinitamente :-).


4

Eu acho que desde que myObject é um int, você deveria

double returnValue=(myObject.Value/10.0); 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.