Desea almacenar su moneda long
y calcular su moneda double
, al menos como respaldo. Desea que todas las transacciones tengan lugar como long
.
La razón por la que desea almacenar su moneda long
es que no quiere perder ninguna moneda.
Supongamos que usa un double
y no tiene dinero. Alguien te da tres monedas de diez centavos y luego las recupera.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Bueno, eso no es tan genial. Tal vez alguien con $ 10 quiera regalar su fortuna dándole primero tres monedas de diez centavos y luego dándole $ 9.70 a otra persona.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
Y luego les devuelves las monedas de diez centavos:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
Esto solo está roto.
Ahora, usemos un largo, y realizaremos un seguimiento de las décimas de centavos (entonces 1 = $ 0.001). Demos a todos en el planeta mil millones, ciento doce millones, setenta y cinco mil ciento cuarenta y tres dólares:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Espera, ¿podemos darles a todos más de mil millones de dólares y gastar solo un poco más de dos? El desbordamiento es un desastre aquí.
Así, cada vez que estés calcular una cantidad de dinero a transferir, el uso double
y Math.round
para obtener una long
. Luego arregle los saldos (sume y reste ambas cuentas) usando long
.
Su economía no tendrá fugas y aumentará a un billón de dólares.
Hay problemas más difíciles, por ejemplo, ¿qué haces si haces veinte pagos? *, Pero esto debería ayudarte a comenzar.
* Calcula cuál es un pago, redondeado a long
; luego multiplique por 20.0
y verifique que esté dentro del rango; si es así, multiplique el pago por 20L
para obtener el monto deducido de su saldo. En general, todas las transacciones deben manejarse como long
, por lo que realmente necesita resumir todas las transacciones individuales; puede multiplicar como acceso directo, pero debe asegurarse de no agregar errores de redondeo y de que no se desborde, lo que significa que debe verificar double
antes de realizar el cálculo real long
.