Solución:
Double.MAX_VALUE es el valor máximo que puede representar un doble (alrededor de 1.7 * 10 ^ 308).
Esto debería terminar en algunos problemas de cálculo, si intenta restar el valor máximo posible de un tipo de datos.
Aunque cuando se trata de dinero, nunca debe utilizar valores de coma flotante, especialmente cuando el redondeo puede causar problemas (entonces tendrá mucho o menos dinero en su sistema).
Resucitar a los muertos aquí, pero por si acaso alguien tropieza con esto como yo. I saber dónde obtener el valor máximo de un doble, la parte (más) interesante fue cómo llegaron a ese número.
double tiene 64 bits. El primero está reservado para el cartel.
Los siguientes 11 representan el exponente (es decir, 1023 sesgados). Es solo otra forma de representar los valores positivos / negativos. Si hay 11 bits, el valor máximo es 1023.
Luego hay 52 bits que contienen la mantisa.
Esto se calcula fácilmente así, por ejemplo:
public static void main(String[] args) {
String test = Strings.repeat("1", 52);
double first = 0.5;
double result = 0.0;
for (char c : test.toCharArray()) {
result += first;
first = first / 2;
}
System.out.println(result); // close approximation of 1
System.out.println(Math.pow(2, 1023) * (1 + result));
System.out.println(Double.MAX_VALUE);
}
También puede probar esto en orden inverso:
String max = "0" + Long.toBinaryString(Double.doubleToLongBits(Double.MAX_VALUE));
String sign = max.substring(0, 1);
String exponent = max.substring(1, 12); // 11111111110
String mantissa = max.substring(12, 64);
System.out.println(sign); // 0 - positive
System.out.println(exponent); // 2046 - 1023 = 1023
System.out.println(mantissa); // 0.99999...8