2012-03-27 15 views
5

Soy principiante en C# y estoy trabajando con números de coma flotante. Necesito hacer una resta entre estos dos números, pero no funciona. Sé que es causado por un número de coma flotante, pero ¿cómo puedo arreglarlo? Y si eres tan bueno, ¿puedes explicarme por qué está sucediendo? Gracias por adelantado.C# resta incorrecta? 12.345 - 12 = 0.345000000000001

+0

¿Qué quiere y cuál es su problema, por favor elabore su pregunta ...? –

+3

Publica tu código por favor. ¿Todas las variables flotan? – c0d3Junk13

+4

¿Se puede publicar el código? El cálculo en su tema se ve muy extraño. El redondeo normal de punto flotante no causa tal comportamiento. – CodesInChaos

Respuesta

7

considerar el uso de decimales en lugar de float:

// Instead of this... 
float a = 12.345F; 
float b = 12; 
float c = a - b; 

// Use this: 
decimal d = 12.345M; 
decimal e = 12; 
decimal f = d - e; 

Jon Skeet da una buena explicación de las diferencias entre los dos tipos en esta respuesta: https://stackoverflow.com/a/618596/446681

+0

+1: si necesita algún tipo de fidelidad numérica, 'decimal' es el camino a seguir. – code4life

+0

Decimal es lo que estaba buscando, muchas gracias. Quiero agradecer también a las personas que explicaron por qué estaba sucediendo. – c0ntrol

+0

Depende de para qué sirven los números. Siempre debe usar 'decimal' por dinero. Pero * no * para simulaciones de física. – dan04

3

¿Cómo está calculando exactamente?

 float a = 12.35F; 
     float b = 12.0F; 
     float ans = a - b; //0.350000381 

     double x = 12.35; 
     double y = 12.0; 
     double ans2 = x - y; //0.34999999999999964 

     decimal n = 12.35m; 
     decimal m = 12.0m; 
     decimal ans3 = n - m; //0.35 

Para mí estos cálculos dan los resultados correctos.

+0

Gracias por el decimal . – c0ntrol

0

Dependiendo de lo que se puede utilizar cualquier tipo decimal, o guárdelo como está, pero redondee antes de mostrar la respuesta

1

recuerde que el comportamiento de los puntos flotantes puede variar según el procesador que esté utilizando.

Here es una pregunta en este foro que trata el tema

Si realmente desea profundizar en el tema, here es una buena fuente sobre la manera de examinar el comportamiento de punto flotante

5

Este no es un problema de ac, este es un problema de ciencias de la computación. Si quiere entender realmente lo que está sucediendo, lea What Every Computer Scientist Should Know About Floating-Point Arithmetic. Si simplemente te importa por qué estás teniendo el problema, es porque Float y Double solo tienen una precisión de 7 y 15 dígitos respectivamente en esta plataforma, y ​​necesitas aplicar la lógica de redondeo para lograr el resultado que estás buscando.

Float C# reference

Double C# reference

Exprimir infinitamente muchos números reales en un número finito de bits requiere una representación aproximada. Aunque hay infinitos números enteros en , en la mayoría de los programas el resultado de los cálculos enteros puede almacenarse en 32 bits en . Por el contrario, dado un número fijo de bits, la mayoría de los cálculos con números reales producirán cantidades que no se pueden representar exactamente utilizando tantos bits. Por lo tanto, el resultado de un cálculo de punto flotante a menudo debe redondearse en el orden para volver a su representación finita. Este error de redondeo es la característica característica del cálculo de coma flotante. Goldberg 1991

+0

Gracias por la explicación. – c0ntrol