Pergunta

O código a seguir em C # não funciona:

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

Assim, a pergunta: qual é a melhor maneira de comparar Duplo e Int

Foi útil?

Solução

Você realmente não pode comparar ponto flutuante e valores integrais de uma forma ingênua; particularmente, uma vez que há a ponto flutuante representação desafia . O que você pode fazer é um subtrair do outro e ver se a diferença entre eles é inferior a alguma precisão você se preocupa, assim:

int iValue = 0;
double dValue = 0.0;

var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
   return true; // items equal

Você realmente tem que definir para si mesmo o que significa equality para você. Por exemplo, você pode querer um valor de ponto flutuante para arredondar para o número inteiro mais próximo, de modo que 3,999999981 será "igual" a 4. Ou você pode querer truncar o valor, por isso seria efetivamente 3. Tudo depende do que você 'está tentando alcançar.

EDIT: Note que eu escolhi 0.0000001 como um exemplo de valor limiar ... você precisa decidir por si mesmo o que a precisão é suficiente para comparação. Basta perceber que você precisa estar dentro dos limites de representação normais de double que eu acredito que é definido como Double.Epsilon.

Outras dicas

É um extremamente má idéia para comparar números inteiros e números de ponto flutuante de igualdade em qualquer idioma. Ele funciona para casos muito simples, mas depois de fazer qualquer matemática em tudo, o likliehood do programa fazendo o que você quer que ele diminui drasticamente.

Tem a ver com a maneira como números de ponto flutuante são armazenados em um binário, sistema digital.

Se você está muito certo você quiser usar isso, crie uma classe para fazer você próprio número de fracções. usar um int para manter o número inteiro, e outro int para manter a fração.

Isso realmente depende do que você considera "igual". Se você quer sua comparação com return true se e somente se o duplo corresponde precisamente o valor inteiro (ou seja, não tem componente fracionário), você deve lançar o seu int para um duplo fazer a comparação:

bool isEqual = (double)iValue == dValue;

Se algo como 1.1 seria considerado igual a 1, você pode lançar a dupla para um int (se você quiser ignorar o componente fracionário no total) ou em volta do casal, se você quer dizer 1,9 para igualar 2.

double val1 = 0;
double val2 = 0.0;
if((val1 - Double.Epsilon) < 0)
{
    // Put your code here
}

      OR

if((val2 - Double.Epsilon) < 0)
{
    // Put your code here
}

onde Double.Epsilon é menor valor possível para o dobro.

Hoje em dia, praticamente o único tempo deve ser comparando valores de tipos double e quer integer ou long pela igualdade estrita é quando, por algum motivo, um está armazenando preso ou passando quantidades integrais como valores de ponto flutuante e precisa de mais tarde para convertê-los de volta. Tal conversão pode, na maioria dos casos, ser mais facilmente conseguido através da fundição do tipo integrante para double, e, em seguida, comparar o resultado de que fundido. Note-se que a conversão de long para double pode ser imprecisa se o número está fora do intervalo ± 2 52 . No entanto, nos dias antes de 64-bit long se tornaram disponíveis, double era um tipo de armazenamento acessível para quantidades inteiros que eram grandes demais para uma int 32 bits, mas pequeno o suficiente para ser manuseado por double.

Note que a conversão de um long para double e, em seguida, fazer a comparação irá produzir um resultado "igual" se o valor nominal da double não corresponde precisamente o valor long, mas representa o double mais próximo possível desse valor. Este comportamento faz sentido se se reconhece que tipos de ponto flutuante na verdade, não representam um único valor preciso, mas sim um intervalo de valores.

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