Pregunta

  

Duplicar posible:
   Por qué está flotando aritmética de punto en C # imprecisa?

He estado tratando con algunos números y C #, y la siguiente línea de código de resultados en un número diferente de lo que cabría esperar:

double num = (3600.2 - 3600.0);

Me esperaba num sea 0,2, sin embargo, resultó ser ,1999999999998181. ¿Hay alguna razón por la cual se está produciendo un cierre, pero sigue siendo diferente decimal?

¿Fue útil?

Solución

Esto se debe a double es un tipo de datos de coma flotante.

Si desea una mayor precisión que podría pasar a utilizar decimal lugar.

El sufijo es literal para decimal m, por lo que para usar la aritmética decimal (y produzca un resultado decimal) se podría escribir el código como

var num = (3600.2m - 3600.0m);

Tenga en cuenta que existen desventajas en el uso de un decimal. Es un tipo de datos de 128 bits en lugar de 64 bits, que es el tamaño de un double. Esto hace que sea más costoso, tanto en términos de memoria y procesamiento. También cuenta con una gama mucho más pequeño que double.

Otros consejos

Hay una razón.

La razón es, que la forma en que el número está guardado en la memoria, en el caso del tipo de datos doble, no permite una representación exacta del número 3600.2. También no permite una representación exacta del número 0.2.

0.2 tiene una representación infinita en binario. Si desea almacenarlo en registros de memoria o procesador, para realizar algunos cálculos, un número cercano a 0,2 con representación finita se almacena en su lugar. Puede que no sea evidente si se ejecuta un código como éste.

double num = (0.2 - 0.0);

Esto es porque en este caso, todos los dígitos binarios disponibles para la representación de los números en el tipo de datos doble se utilizan para representar la parte fraccionaria del número (sólo hay la parte fraccionaria) y la precisión es más alta. Si almacena el número 3600.2 en un objeto de tipo doble, algunos dígitos se utilizan para representar la parte entera - 3600 y hay menos dígitos que representan parte fraccionaria. La precisión es menor y fraccionada parte que es, de hecho, almacenado en la memoria difiere de 0.2 suficiente, que se hace evidente después de la conversión de doble a cadena

Cambiar el tipo de decimal a:

decimal num = (3600.2m - 3600.0m);

También debería leer este .

Wikipedia

No se puede explicar mejor. También puedo sugerir la lectura Lo que todo informático debe saber sobre la aritmética de punto flotante . O ver las preguntas relacionadas en Stackoverflow .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top