Java - Arredondar para duas casas decimais com base no terceiro valor decimal [duplicado]
Dec 16 2020
Eu estive sentado nisso por um dia pensando como um aluno do 5º ano.
public class Tester
{
static String actualValue = "";
private static DecimalFormat df2 = new DecimalFormat("#.##"); //To round off to two decimal places.
static double regPrice = 0.0;
static double regPrice2 = 0.0;
public static void main(String[] args)
{
regPrice2 = 1506.365;
System.out.println("reg price 1 is: "+regPrice2);
System.out.println("reg price 1 after rounding is is: "+round(regPrice2));
regPrice = 8535.765;
System.out.println("reg price is: "+regPrice);
System.out.println("reg price after rounding is: "+round(regPrice));
}
public static double round(double value)
{
df2.setRoundingMode(RoundingMode.HALF_UP);
String returnValue = df2.format(value);
double actualValue = Double.parseDouble(returnValue);
return actualValue;
}
}
| Resultado | Valor 1 | Valor 2 |
|---|---|---|
| Real | 1506,37 | 8535. 76 |
| Esperado | 1506,37 | 8535. 77 |
Por que o arredondamento está funcionando para o primeiro número, mas não para o segundo? Como posso fazer isso funcionar?
Respostas
1 TomášZáluský Dec 16 2020 at 07:51
Graças à representação do ponto flutuante, o que você acha que 1506.365 ou 8535.765 é na verdade um número ligeiramente maior ou menor do que o esperado. Os números de ponto flutuante são representados como mantissa e expoente. Portanto, por exemplo, para 0,365 e 0,765 o arredondamento é feito de maneira diferente. O arredondamento próximo à metade aparece como uma direção aleatória. Use BigDecimalse precisar de um número preciso.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?