Pergunta

Eu tenho um código, e eu não entendo isso. Estou desenvolvendo uma aplicação que precisão é muito importante. mas isso não acontece importante para .NET, por quê? Eu não sei.

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

mas a caixa de mensagem mostra: 3,5 Por favor me ajude, obrigado.

Foi útil?

Solução

Você pode ter precisão, mas isso depende do que outra coisa que você quer fazer. Se você colocar o seguinte em um aplicativo de console:

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);

Você receberá

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

Mas note que a função Pow, como quase tudo na classe Math, leva apenas duplas:

double Pow(double x, double y);

Então, você não pode tomar o seno de um decimal (outro então, convertendo-a dobrar)

Veja também esta questão .

Outras dicas

Se você está fazendo nada onde a precisão é muito importante, você precisa estar ciente das limitações de ponto flutuante. Uma referência boa é David Goldberg de "O Que Todo cientista computador deve saber sobre Floating-Point Arithmetic ".

Você pode achar que de ponto flutuante não lhe dá precisão suficiente e você precisa trabalhar com um tipo decimal. Estes, no entanto, são sempre muito mais lento do ponto flutuante - é um compromisso entre precisão e velocidade

.

A precisão de um Double é de 15 dígitos (17 dígitos internamente). O valor que você calcular com Math.Pow é correto, mas quando você adicioná-lo à value ele só é pequeno demais para fazer a diferença.

Edit:
A Decimal pode lidar com essa precisão, mas não o cálculo. Se você quiser que a precisão, você precisa fazer o cálculo, em seguida, converter cada valor a uma Decimal antes de adicioná-los juntos:

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

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

MessageBox.Show(result.ToString());

Ou use o Decimal digite em vez de duplo.

precisão Duplo significa que ele pode prender 15-16 dígitos. 3,5 + 1E-20 = 21 dígitos. Ele não pode ser representada em dupla precicion. Você pode usar outro tipo como decimal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top