2010-04-30 27 views
7

He encontrado un problema de precisión con el doble en .NET. Pensé que esto solo se aplicaba a las carrozas, pero ahora veo que el doble es un flotador.doble menos doble dando problemas de precisión

double test = 278.97 - 90.46; 
Debug.WriteLine(test) //188.51000000000005 

//correct answer is 188.51 

¿Cuál es la forma correcta de manejar esto? ¿Redondo? ¿Descartar los lugares decimales innecesarios?

+0

¿Para qué usa esos dobles? Si para valores monetarios, por ejemplo, tiene que usar otro tipo. –

+0

Sí, es dinero. – Alistair

+0

En ese caso, escucha a Michael. Los dobles te morderán. –

Respuesta

8

Utilice el tipo de datos decimal. "El tipo de valor decimal es apropiado para cálculos financieros que requieren grandes cantidades de dígitos integrales y fraccionarios significativos y sin errores de redondeo".

+0

+1 Si está haciendo cosas financieras, * realmente * necesita usar 'decimal'. –

+1

Decimal es el tipo de datos correcto que debe usar para los cálculos financieros. No elimina la necesidad de redondeo, pero minimiza los errores debidos al redondeo. –

+0

Gracias. Esto solucionó mi problema. – Alistair

4

Esto ocurre en muchos idiomas y se debe al hecho de que generalmente no podemos almacenar dobles o flotantes precisamente en hardware digital. Para obtener una explicación detallada de cómo se almacenan a menudo los dobles, los flotantes y todos los demás valores de punto flotante, consulte las diversas especificaciones de IEEE que se describen en wikipedia. Por ejemplo: http://en.wikipedia.org/wiki/Double_precision

Por supuesto, hay otros formatos, como el formato de punto fijo. Pero esta imprecisión está en la mayoría de los lenguajes, y por qué a menudo necesita usar pruebas epsilon en lugar de pruebas de igualdad cuando usa dobles en condicionales (es decir, abs (x - y) < = 0.0001 en lugar de x == y).

La forma de manejar esta imprecisión depende de usted y depende de su aplicación.

Cuestiones relacionadas