Pregunta

Tengo un código, y yo no lo entiendo. Estoy desarrollando una aplicación que la precisión es muy importante. pero no es importante para .NET, ¿por qué? No sé.

double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());

pero el cuadro de mensaje muestra: 3.5 Por favor, ayúdame, Gracias.

¿Fue útil?

Solución

Puede tener precisión, pero depende de qué otra cosa que quiere hacer. Si ponemos la siguiente en una aplicación de consola:

double a = 1e-20;
Console.WriteLine(" a  = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);

decimal b = 1e-20M;
Console.WriteLine(" b  = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);

Usted recibirá

 a  = 1E-20
1+a = 1
 b  = 0,00000000000000000001
1+b = 1,00000000000000000001

Pero en cuenta que el Pow función, como casi todo en la clase de matemáticas, sólo toma en dobles:

double Pow(double x, double y);

Así que usted no puede tomar el seno de un decimal (que no sea mediante la conversión a doble)

También ver esta pregunta .

Otros consejos

Si estás haciendo algo donde la precisión es muy importante, es necesario ser conscientes de las limitaciones de punto flotante. Una buena referencia es David Goldberg "Lo que todo informático debe saber sobre la aritmética de punto flotante ".

Es posible que en coma flotante no le da la suficiente precisión y hay que trabajar con un tipo decimal. Estos, sin embargo, son siempre mucho más lenta que la de punto flotante - es un compromiso entre la precisión y la velocidad

.

La precisión de un Double es de 15 dígitos (17 dígitos internamente). El valor que se calcula con Math.Pow es correcto, pero cuando se agrega a value simplemente es demasiado pequeño para hacer una diferencia.

Editar:
Un decimal puede manejar esa precisión, pero no el cálculo. Si quieres que la precisión, lo que necesita hacer el cálculo, a continuación, convertir cada valor a un Decimal antes de añadirlos juntos:

double value = 3.5;
double small = Math.Pow(10, -20);

Decimal result = (Decimal)value + (Decimal)small;

MessageBox.Show(result.ToString());

O utilice el decimal escriba en lugar de doble.

Doble precisión significa que puede contener 15-16 dígitos. 3,5 + 1e-20 = 21 dígitos. No se puede representar en doble precicion. Se puede utilizar otro tipo como decimal.

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