Posible pérdida de fracción


119

Perdóname si esta es una pregunta ingenua, sin embargo, hoy estoy perdido.

Tengo un cálculo de división simple como sigue:

double returnValue = (myObject.Value / 10);

El valor es un int en el objeto.

Recibo un mensaje que dice Posible pérdida de fracción. Sin embargo, cuando cambio el doble a un int, el mensaje desaparece.

¿Alguna idea sobre por qué sucedería esto?


Gracias a todos por las excelentes respuestas. Tiene sentido ahora que pierde el punto decimal al dividir 2 valores int.
CodeLikeBeaker

Respuestas:


168

Cuando divide dos enteros en un valor de punto flotante, la fracción se pierde. Si lanza uno de los elementos a un flotador, no obtendrá este error.

Entonces, por ejemplo, convierta 10 en 10.0

double returnValue = (myObject.Value / 10.0);

57

Está haciendo una división de enteros si myObject.Valuees un int, ya que ambos lados del /son de tipo entero.

Para hacer una división de punto flotante, uno de los números de la expresión debe ser de tipo punto flotante. Eso sería cierto si myObject.Value fuera un doble, o cualquiera de los siguientes:

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 número entero dividido por un número entero devolverá un número entero. Convierte Value en un doble o divide por 10.0.


7

Suponiendo que myObject.Valuees an int, la ecuación myObject.Value / 10será una división entera que luego se convertirá en un doble.

Eso significa que myObject.Value siendo 12 dará como resultado que returnValue se convierta en 1, no 1.2.

Primero debes emitir los valores:

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

Esto daría como resultado el valor correcto 1.2, al menos tan correcto como lo permitan los dobles dadas sus limitaciones, pero eso se discute en otra parte de SO, casi infinitamente :-).


4

Creo que como myObject es un int, deberías

double returnValue=(myObject.Value/10.0); 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.