Eu tenho um flutuador primitivo e preciso como um duplo primitivo. Simplesmente lançar o flutuador para dobrar me dá uma precisão extra estranha. Por exemplo:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
No entanto, se em vez de lançar, eu produzir o float como uma string e analisar a string como um double, eu consigo o que quero:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
Existe uma maneira melhor do que ir para String e voltar?
fonte
Encontrei a seguinte solução:
Se você usar float e double em vez de Float e Double, use o seguinte:
fonte
Use um em
BigDecimal
vez defloat
/double
. Existem muitos números que não podem ser representados como ponto flutuante binário (por exemplo,0.1
). Portanto, você deve sempre arredondar o resultado para uma precisão ou uso conhecidoBigDecimal
.Consulte http://en.wikipedia.org/wiki/Floating_point para obter mais informações.
fonte
BigDecimal
pois isso detectará a maioria dos erros comuns. Se as coisas estão muito lentas, eles precisam aprender mais e encontrar maneiras de otimizar seus problemas. A otimização prematura é a raiz de todos os males - DE Knuth.Os carros alegóricos, por natureza, são imprecisos e sempre apresentam "problemas" de arredondamento. Se a precisão for importante, você pode considerar a refatoração de seu aplicativo para usar Decimal ou BigDecimal.
Sim, os flutuantes são computacionalmente mais rápidos do que os decimais devido ao suporte do processador. No entanto, você quer rápido ou preciso?
fonte
Para obter informações, isso vem no Item 48 - Evite flutuar e dobrar quando os valores exatos são exigidos, de Effective Java 2ª edição de Joshua Bloch. Este livro está repleto de coisas boas e definitivamente vale a pena dar uma olhada.
fonte
Isto funciona?
fonte
Uma solução simples que funciona bem é analisar o duplo da representação da string do flutuador:
Não é super eficiente, mas funciona!
fonte