Pergunta

Duplicate possíveis:
Por que é ponto flutuante aritmética em C # imprecisa?

Tenho lidado com alguns números e C #, e a seguinte linha de código resulta em um número diferente do que se poderia esperar:

double num = (3600.2 - 3600.0);

Eu esperava num ser 0,2, no entanto, acabou por ser ,1999999999998181. Existe alguma razão pela qual ele está produzindo uma estreita, mas ainda decimal diferente?

Foi útil?

Solução

Isto porque double é um tipo de dados de ponto flutuante.

Se você quiser maior precisão você poderia passar a usar decimal vez.

O sufixo literal para decimal é m, então a aritmética uso decimal (e produzir um resultado decimal), você pode escrever seu código como

var num = (3600.2m - 3600.0m);

Note que existem desvantagens de usar um decimal. É um tipo de dados de 128 bits em oposição a 64 bits, que é do tamanho de um double. Isso torna mais caro, tanto em termos de memória e processamento. Ele também tem uma gama muito menor do que double.

Outras dicas

Há uma razão.

A razão é que a maneira como o número é armazenado na memória, no caso do tipo de dados dupla, não permite uma representação exata do número 3600,2. Ele também não permite uma representação exata do número 0.2.

0,2 tem uma representação binária em infinito. Se quiser armazená-lo na memória ou processador registros, para realizar alguns cálculos, um número próximo a 0,2 com representação finita é armazenado em seu lugar. Ele pode não ser aparente se você executar um código como este.

double num = (0.2 - 0.0);

Isto porque, neste caso, todos os dígitos binários disponíveis para representar números no tipo de dados duplo são usados ??para representar a parte fracionária do número (há apenas a parte fracionária) e a precisão é maior. Se você armazenar o número 3.600,2 em um objeto do tipo double, alguns dígitos são usados ??para representar a parte inteira - 3600 e há menos dígitos que representam parte fracionária. A precisão é menor e parte fracionária que é de fato armazenado em difere de memória de 0,2 suficiente, que torna-se evidente após a conversão da dupla para string

Alterar seu tipo de decimal:

decimal num = (3600.2m - 3600.0m);

Você também deve ler este .

Wikipedia

Não é possível explicar melhor. Eu também pode sugerir a leitura O que cada cientista computador deve saber sobre Floating-Point Arithmetic . Ou ver questões sobre StackOverflow .

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