Desea almacenar su moneda longy 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 longes que no quiere perder ninguna moneda.
Supongamos que usa un doubley 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 doubley Math.roundpara 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.0y verifique que esté dentro del rango; si es así, multiplique el pago por 20Lpara 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 doubleantes de realizar el cálculo real long.