double
sólo tiene 15/16 de dígitos de precisión y cuando usted le da un número que no puede representar (que es la mayoría de las veces, incluso es 0,1 no es exacto) toma el número representable más cercano.
Si quiere representar exactamente 9999999999999999
, necesita usar BigDecimal.
BigDecimal bd = new BigDecimal("9999999999999999");
System.out.println(new DecimalFormat("#.##").format(bd));
impresiones
9999999999999999
muy pocos problemas del mundo real necesitan esta precisión porque no se puede medir con precisión esta nada de todos modos. es decir, a un error de 1 parte por quintillón.
puede encontrar el mayor entero representable con
// search all the powers of 2 until (x + 1) - x != 1
for (long l = 1; l > 0; l <<= 1) {
double d0 = l;
double d1 = l + 1;
if (d1 - d0 != 1) {
System.out.println("Cannot represent " + (l + 1) + " was " + d1);
break;
}
}
impresiones
Cannot represent 9007199254740993 was 9.007199254740992E15
El mayor entero representable es 9007199254740992, ya que necesita una menos bits (como su par)
aritmética de coma flotante --- el mayor misterio de la ciencia de la computación desde 1985 – subsub