Quero imprimir um valor duplo em Java sem forma exponencial.
double dexp = 12345678;
System.out.println("dexp: "+dexp);
Ele mostra esta notação E: 1.2345678E7
.
Quero que imprima assim: 12345678
Qual é a melhor maneira de evitar isso?
Você poderia usar printf()
com %f
:
double dexp = 12345678;
System.out.printf("dexp: %f\n", dexp);
Isso será impresso dexp: 12345678.000000
. Se você não deseja a parte fracionária, use
System.out.printf("dexp: %.0f\n", dexp);
Isso usa a linguagem do especificador de formato explicada na documentação .
O toString()
formato padrão usado no seu código original está explicitado aqui .
dexp: 12345681.000000
que é errado value.And, na verdade depois então eu quero para exibi-lo na minha página web onde se exibir como este1.2345678E7
.É lá de qualquer maneira pela qual eu posso armazená-lo em qualquer dupla como12345678
e alguma outra maneira?%.0f
.%.0f
arredonda o número. Existe uma maneira de simplesmente descartar os zeros à direita?A Java evita a notação E em um duplo:
Cinco maneiras diferentes de converter um número duplo para um número normal:
Este programa imprime:
Quais são todos do mesmo valor.
Protip: se você está confuso sobre o motivo pelo qual esses dígitos aleatórios aparecem além de um certo limite no valor duplo, este vídeo explica: computerphile por que
0.1
+0.2
igual a0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
fonte
Em resumo:
Se você quiser se livrar dos zeros à direita e dos problemas de localidade, use:
Explicação:
Por que outras respostas não me agradaram:
Double.toString()
ouSystem.out.println
ouFloatingDecimal.toJavaFormatString
usa notações científicas se o dobro for menor que 10 ^ -3 ou maior que ou igual a 10 ^ 7Ao usar
%f
, a precisão decimal padrão é 6; caso contrário, você pode codificá-la, mas isso resultará em zeros extras adicionados se você tiver menos casas decimais. Exemplo:Usando
setMaximumFractionDigits(0);
ou%.0f
você remove qualquer precisão decimal, o que é bom para números inteiros / longos, mas não para o dobro:Usando DecimalFormat, você depende localmente. Na localidade francesa, o separador decimal é uma vírgula, não um ponto:
O uso do código do idioma PORTUGUÊS garante que você obtenha um ponto para o separador decimal, onde quer que o seu programa seja executado.
Por que usar 340 então para
setMaximumFractionDigits
?Duas razões:
setMaximumFractionDigits
aceita um número inteiro, mas sua implementação tem um número máximo permitido dosDecimalFormat.DOUBLE_FRACTION_DIGITS
quais é igual a 340Double.MIN_VALUE = 4.9E-324
portanto, com 340 dígitos, você não deve arredondar o dobro e perder a precisão.fonte
new BigDecimal(myvalue).toPlainString()
Da descrição em docs.oracle.com/javase/7/docs/api/java/math/… ), não é imediatamente óbvio como ele se comporta quando recebem diferentes tipos de números, mas elimina a notação científica .new BigDecimal(0.00000021d).toPlainString()
saída0.0000002100000000000000010850153241148685623329583904705941677093505859375
que não é o que você esperaria ...BigDecimal.valueOf(0.00000021d).toPlainString()
funciona tão bem (ele usa o construtor String of BigDecimal é por isso)Você pode experimentá-lo
DecimalFormat
. Com esta classe, você é muito flexível ao analisar seus números.Você pode definir exatamente o padrão que deseja usar.
No seu caso, por exemplo:
fonte
Eu tenho outra solução envolvendo o toPlainString () do BigDecimal, mas desta vez usando o construtor String, recomendado no javadoc:
Parece assim em sua forma mais curta:
Antes do Java 8, isso resulta em "0,0" para quaisquer duplas com valor zero, portanto, você deve adicionar:
NaN e valores infinitos devem ser verificados extra.
O resultado final de todas estas considerações:
Isso também pode ser copiado / colado para funcionar bem com o Float.
fonte
d.doubleValue() == 0
invés ded == 0
?Isso funcionará desde que seu número seja um número inteiro:
Se a variável dupla tiver precisão após o ponto decimal, ela será truncada.
fonte
Eu precisava converter alguns valores duplos em moeda e descobri que a maioria das soluções estava correta, mas não para mim.
A
DecimalFormat
acabou por ser o caminho para mim, então aqui está o que eu fiz:Como você pode ver, se o número for natural, recebo - digamos - 20000000 em vez de 2E7 (etc.) - sem nenhum ponto decimal.
E se for decimal, recebo apenas dois dígitos decimais.
fonte
O compilador Java / Kotlin converte qualquer valor maior que 9999999 (maior ou igual a 10 milhões) em notação científica, isto é. Notação Epsilion .
Ex: 12345678 é convertido em 1,2345678E7
Use este código para evitar a conversão automática em notação científica:
fonte
O código a seguir detecta se o número fornecido é apresentado em notação científica. Nesse caso, é representado na apresentação normal com um máximo de '25' dígitos.
fonte
Acho que todos tiveram a ideia certa, mas todas as respostas não foram diretas. Eu posso ver isso sendo um pedaço de código muito útil. Aqui está um trecho do que irá funcionar:
a
".8"
é onde você define o número de casas decimais que você gostaria de mostrar.Estou usando o Eclipse e não funcionou.
Espero que isso tenha sido útil. Eu gostaria de receber qualquer feedback!
fonte
Eu tive esse mesmo problema no meu código de produção quando o estava usando como uma entrada de string para uma função math.Eval () que usa uma string como "x + 20/50"
Eu olhei para centenas de artigos ... No final, eu fui com isso por causa da velocidade. E porque a função Eval iria convertê-lo novamente em seu próprio formato numérico e math.Eval () não suportava o E-07 à direita que outros métodos retornavam, e qualquer coisa acima de 5 dp era muito detalhe para minha aplicação .
Agora isso é usado no código de produção para um aplicativo que possui mais de 1.000 usuários ...
fonte
Isso pode ser uma tangente .... mas se você precisar colocar um valor numérico como um número inteiro (que é muito grande para ser um número inteiro) em um serializador (JSON etc.), provavelmente desejará "BigInterger"
Exemplo: o valor é uma sequência - 7515904334
Precisamos representá-lo como numérico em uma mensagem Json: {"contact_phone": "800220-3333", "servicer_id": 7515904334, "servicer_name": "SOME CORPORATION"}
Não podemos imprimi-lo ou obteremos o seguinte: {"contact_phone": "800220-3333", "servicer_id": "7515904334", "servicer_name": "SOME CORPORATION"}
Adicionar o valor ao nó dessa maneira produz o resultado desejado: BigInteger.valueOf (Long.parseLong (value, 10))
Não tenho certeza se isso é realmente um tópico, mas como essa pergunta foi a minha maior surpresa quando procurei minha solução, pensei em compartilhar aqui para o benefício de outras pessoas, mentir, que pesquisam mal. : D
fonte
Para valores inteiros representados por um
double
, você pode usar esse código, que é muito mais rápido que as outras soluções.fonte
Minha solução: String str = String.format ("% .0f", yourDouble);
fonte