Pergunta

Eu estou usando java e referindo-se ao tipo de dados "double". Para mantê-lo curto, estou lendo alguns valores de entrada padrão que eu li no meu código como duplos (eu seria muito melhor usar algo como BigInteger mas agora não é possível).

Espero obter valores duplas do usuário, mas às vezes eles podem digitar coisas como: 999999999999999999999999999,9999999999 que eu acho que está além de uma representação precisa de casal e get de arredondado para 1.0E27 (provavelmente).

Eu gostaria de obter algumas dicas sobre como detectar se um valor específico não seria capaz de ser representado com precisão em um duplo e exigiria arredondamento (para que eu pudesse recusar esse valor ou outras ações).

Muito obrigado

Foi útil?

Solução

A maioria dos valores introduzidos por seres humanos não será exatamente representable com um duplo.

Por exemplo, você quer impedir que o usuário entrar 0.1? Isso não é exatamente representável como uma dupla.

Para encontrar a escala do erro, você poderia fazer algo como:

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

Em seguida, verifique se o "erro" é razoavelmente pequena.

Outras dicas

double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();

Você não pode usar uma dupla para armazenar algo exatamente da maneira que você está pedindo, muito raramente um usuário pode digitar um número que a dupla pode perfeitamente representar, mas que seria de apenas coincidência. Se você precisa armazenar o número exato que você poderia usar uma corda desde que você não precisa fazer qualquer manipulação. Se você precisa mais do que isso, então provavelmente há bibliotecas que são feitas para esse tipo de matemática precisa.

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