Por que o código de divisão inteiro dá a resposta errada?

Eu tenho uma divisão muito simples em Java (é uma quantidade de produto / produção por hora), no entanto, sempre que eu faço esta divisão, eu recebo erros estranhos:

float res = quantity / standard; 

Eu tentei a divisão acima com vários valores e sempre recebo erros, no entanto o que eu tentei em todos os outros lugares e acertei foi o seguinte:

Em todo lugar do mundo:

 13.6 = 6800 / 500; 

Java:

 13.0 = 6800 / 500; 

Eu pesquisei BigDecimal e BigInteger, no entanto eu não encontrei uma maneira de criar essa divisão com eles, existe alguma outra maneira de fazer essa divisão em Java sem ter erros de precisão?

Qualquer ajuda será muito apreciada.

Você está dividindo inteiros, o que significa que você está usando a divisão inteira .

Na divisão inteira, a parte fracionária do resultado é descartada.

Tente o seguinte:

 float res = (float) quantity / standard; ^^^^^^^ 

O acima força o numerador a ser tratado como um float que por sua vez promove o denominador a flutuar também, e uma divisão de flutuação é executada em vez de uma divisão int.

Note que se você está lidando com literais, você pode mudar

 float f = 6800 / 500; 

para include o sufixo f para tornar o denominador um float:

 float f = 6800f / 500; ^ 

Se você se preocupasse com a precisão, eu sugeriria usar o double que tem mais que o dobro do número de dígitos de precisão. No entanto, o ponto flutuante representa apenas frações que são uma sum ou potências de 0,5. Isso significa que 0.6 é representado apenas aproximadamente. Isso não precisa ser um problema com o arredondamento apropriado.

 double d = (double) 6800 / 500; 

ou

 double d = 6800.0 / 500; 

oi tentar este pode ajudar ful sua exigência

 double percent=(7819140000l-3805200000l)*100f/7819140000l; public String format_Decimal(double decimalNumber) { NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(5); nf.setMinimumFractionDigits(2); nf.setRoundingMode(RoundingMode.HALF_UP); String x = nf.format(decimalNumber); return x; } 

No meu caso eu estava fazendo isso:

 double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1)); 

Em vez do “correto”:

 double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);