Java: redondee a dos decimales según el tercer valor decimal [duplicado]
Dec 16 2020
He estado sentado en esto por un día pensando como un estudiante de quinto grado.
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;
}
}
Salida | Valor 1 | Valor 2 |
---|---|---|
Real | 1506,37 | 8535. 76 |
Esperado | 1506,37 | 8535. 77 |
¿Por qué funciona el redondeo para el primer número pero no para el segundo? ¿Cómo puedo hacer que esto funcione?
Respuestas
1 TomášZáluský Dec 16 2020 at 07:51
Gracias a la representación de punto flotante, lo que cree que 1506.365 o 8535.765 es en realidad un número ligeramente mayor o menor de lo que espera. Los números de coma flotante se representan como mantisa y exponente. Por lo tanto, por ejemplo, para 0.365 y 0.765 el redondeo se realiza de manera diferente. El redondeo cerca de las mitades aparece como en una dirección aleatoria. Úselo BigDecimal
si necesita un número preciso.