Você quer armazenar sua moeda em long
e calcular a sua moeda em double
, pelo menos, como um backup. Você deseja que todas as transações ocorram como long
.
O motivo pelo qual você deseja armazenar sua moeda long
é que não deseja perder nenhuma moeda.
Vamos supor que você use a double
e não tenha dinheiro. Alguém te dá três centavos e depois os leva de volta.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Bem, isso não é tão legal. Talvez alguém com US $ 10 queira doar sua fortuna dando-lhe três centavos e depois US $ 9,70 a outra pessoa.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
E então você devolve os centavos:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
Isso está quebrado.
Agora, vamos usar um longo e acompanharemos décimos de centavos (então 1 = $ 0,001). Vamos dar a todos no planeta um bilhão, cento e doze milhões, setenta e cinco mil, cento e quarenta e três dólares:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Espere, podemos dar a todos mais de um bilhão de dólares e gastar apenas um pouco mais de dois? O estouro é um desastre aqui.
Assim, sempre que você está calculando uma quantia de dinheiro para transferir, utilização double
e Math.round
para obter um long
. Em seguida, corrija os saldos (adicione e subtraia ambas as contas) usando long
.
Sua economia não vai vazar e chegará a um bilhão de dólares.
Existem problemas mais complicados - por exemplo, o que você faz se fizer vinte pagamentos? * - mas isso deve ajudá-lo a começar.
* Você calcula o que é um pagamento, arredondado para long
; depois multiplique 20.0
e verifique se está dentro do alcance; Nesse caso, você multiplica o pagamento 20L
para obter o valor deduzido do seu saldo. Em geral, todas as transações devem ser tratadas como long
, portanto, você realmente precisa resumir todas as transações individuais; você pode multiplicar como um atalho, mas não se esqueça de adicionar erros de arredondamento e não estourar, o que significa que você precisa verificar double
antes de fazer o cálculo real long
.