Pergunta

O que é a gama inclusiva de float e double em Java?

Por que você não é recomendado para uso float ou double para qualquer coisa onde a precisão é fundamental?

Foi útil?

Solução

Double classe de Java tem membros contendo o valor mínimo e máximo para o tipo.

2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.

Confira as Min_VALUE e estáticas MAX_VALUE membros finais de Double.

(alguns) As pessoas vão sugerir contra o uso de tipos de ponto flutuante por coisas onde a precisão e precisão são fundamentais porque erros de arredondamento pode jogar fora cálculos por mensurável (pequeno) valores.

Outras dicas

tipos de dados primitivos do Java

boolean: 1-bit. Pode assumir os valores verdadeiros e só falsos.

byte: 1 byte assinado (complemento de dois). Capas valores de -128 a 127.

curta: 2 bytes, assinados (complemento de dois), -32.768 a 32.767

int: 4 bytes, assinados (complemento de dois). 2,147,483,648 a 2.147.483.647.

longa: 8 bytes assinado (complemento de dois). Varia de -9.223.372.036.854.775.808 para +9.223.372.036.854.775.807.

float: 4 bytes, IEEE 754. abrange uma gama de 1.40129846432481707e-45 a 38 3.40282346638528860e + (positivo ou negativo).

double: 8 bytes IEEE 754. abrange uma gama de 4.94065645841246544e-324d para 1.79769313486231570e + 308d (positivo ou negativo).

caractere: 2 bytes, não assinados, Unicode, 0 a 65.535

binários números de ponto flutuante de precisão têm características interessantes, uma vez que o valor é armazenado como um inteiro binário elevado a uma potência binário. Quando se lida com valores sub-inteiros (isto é, valores entre 0 e 1), poderes negativos de dois "off rodada" muito diferente do que potências negativas de dez.

Por exemplo, o número de 0,1 pode ser representada por 1 x 10 -1 , mas não há nenhuma combinação de base-2 expoente e mantissa que podem precisamente representam 0,1 - o mais próximo que você recebe é ,10000000000000001.

Então, se você tiver um aplicativo em que você está trabalhando com valores como 0,1 ou 0,01 um grande negócio, mas onde pequenas (menos de ,000000000000001%) erros não podem ser tolerados, números de ponto flutuante, em seguida, binários não são para você.

Por outro lado, se os poderes de dez não são "especiais" para a sua aplicação (potências de dez são importantes nos cálculos da moeda, mas não em, digamos, a maioria das aplicações da física), então você está realmente melhor fora de usar binária de ponto flutuante , já que é normalmente pelo menos uma ordem de magnitude mais rápido, e é muito mais eficiente de memória.

O artigo da documentação Python em problemas e limitações ponto flutuantes faz um excelente trabalho de explicar esta questão de uma forma fácil de entender forma. Wikipedia também tem um bom artigo sobre ponto flutuante que explica a matemática por trás da representação.

A partir Primitives dados :

  • float: O tipo de dados float é um single-precisão de 32 bits IEEE 754 ponto flutuante. Sua gama de valores é além do escopo desta discussão, mas é especificado na seção 4.2.3 da especificação de linguagem Java. Como com as recomendações para byte e short, use uma float (em vez de double) se você precisa economizar memória em grandes conjuntos de ponto flutuante números. Este tipo de dados nunca deve ser utilizada para os valores precisos, tal como moeda. Para isso, você precisará usar o java.math.BigDecimal classe em vez. Números e Cordas tampas BigDecimal e outras classes úteis fornecidos pela Plataforma Java.

  • double : O tipo de dados double é uma precisão dupla de 64 bits IEEE 754 ponto flutuante. Sua gama de valores é além do escopo desta discussão, mas é especificado na seção 4.2.3 da especificação de linguagem Java. Para valores decimais, este tipo de dados é geralmente a opção padrão. Como mencionado acima, este tipo de dados deve nunca podem ser utilizadas para valores precisos, tal como moeda.

Para o intervalo de valores, consulte a seção 4.2.3 Tipos de Ponto Flutuante, formatos e valores dos JLS.

Claro que você pode usar flutuadores ou duplos para as coisas "críticas" ... Muitas aplicações não fazem nada, mas processar números usando estes tipos de dados.

Você pode ter entendido mal algumas das várias advertências sobre números de ponto flutuante, como a recomendação de nunca comparar para exata igualdade , e assim por diante.

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