Pergunta

Eu estou tentando levar dois 7 números de um dígito (de origem e registro do alvo contagens) e calcular o percentual de registros ausentes na contagem alvo.

Por exemplo, o meu recorde contagem poderia ser 4084094 para a fonte, e 4081313 para o alvo. Eu também estou usando a fórmula acompanhamento para calc a percentagem: ((1 - (destino / origem)) * 100)

Para o meu exemplo, eu deveria receber o valor de cerca de 0,0681%

Eu sou sou novo para Java e JSP, e eu não sou capaz de conseguir a porcentagem para exibir corretamente. Parece-me obter apenas um valor arredondado para 0.

Eu também tentei BigDecimal, sem sucesso.

Mesmo o seguinte código exibe simples o valor de 1-1, então eu obviamente estou fazendo somthing seriamente errado:

<%
BigDecimal percentMiss;
long tmp = 600/500;
percentMiss = BigDecimal.valueOf(tmp);
%>
<%=percentMiss.toString()%>-<%=tmp%>
Foi útil?

Solução

O problema está na seguinte linha

long tmp = 600/500;

Você não pode armazenar números de ponto flutuante em um longo, em vez disso você deve considerar usando o seguinte código:

double tmp = (double)600 / (double)500;

e, em seguida, exibir tmp, que deve ter um em algum lugar valor entre 0 e 1 (no seu caso 1.2, porque você tem que mudar seu cálculo a 500/600)

Outras dicas

O problema é, obviamente, que você é dividir dois números longos.

Eu recomendaria usar DecimalFormat para exibir o número. Se você estiver usando JSTL, em seguida, uma solução ainda melhor é usar o marcas formato :

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:formatNumber value="${value}" minFractionDigits="2" maxFractionDigits="2"/>

Seu problema é que 600 e 500 são valores inteiros, e uma divisão entre eles terão um resultado inteiro, que você atribui a um inteiro longo. Depois disso, a parte fracionária do resultado se foi (duas vezes) e você não pode obtê-lo de volta.

A fim de obter um resultado fracionário, pelo menos um dos valores de entrada das necessidades de divisão para ser não-inteiro. Você pode conseguir isto, lançando-os para double ou float, ou fazendo os literais explicitamente casal ou flutuador como esta:

500.0 // implicitly double
500f // float literal
500d // double literal

No entanto, a impressão do resultado de uma Divisão dupla / float, muitas vezes, têm mais lugares decimais do que você quer mesmo que eles não deveriam estar no resultado (por exemplo 1/10 pode resultar em 0.100000001490116119384765625), devido a a forma como esses números são armazenados como frações binárias

Você pode eliminar esses dígitos indesejados usando java.lang.DecimalFormat, mas BigDecimal é a melhor opção, uma vez que utiliza internamente frações decimais e, portanto, entregar os resultados realmente corretas, oferecendo controle exato sobre modos de arredondamento. Claro, isso exige que você use BigDecimal para o cálculo em si, e não como "ingrediente vodu" para corrigir um resultado já quebrado.

new BigDecimal(600).divide(new BigDecimal(500))

Leia a documentação da API para BigDecimal para mais informações.

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