Vuoi conservare la tua valuta long
e calcolare la tua valuta double
, almeno come backup. Volete che tutte le transazioni avvengano come long
.
Il motivo per cui vuoi conservare la tua valuta long
è che non vuoi perdere alcuna valuta.
Supponiamo che tu usi un double
, e non hai soldi. Qualcuno ti dà tre dimes, e poi li riprende.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Beh, non è così bello. Forse qualcuno con $ 10 vuole regalare la propria fortuna dandoti prima tre dimes e poi dando $ 9,70 a qualcun altro.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
E poi restituisci loro le dimes:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
Questo è solo rotto.
Ora, usiamo un lungo e terremo traccia dei decimi di centesimi (quindi 1 = $ 0,001). Diamo a tutti sul pianeta un miliardo, centododici milioni, settantacinquemila, centoquarantatre dollari:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Aspetta, possiamo dare a tutti oltre un miliardo di dollari e spendere solo poco più di due? L'overflow è un disastro qui.
Quindi, ogni volta che stai calcolando una somma di denaro da trasferire, usa double
e Math.round
per ottenere un long
. Quindi aggiusta i saldi (aggiungi e sottrai entrambi gli account) usando long
.
La tua economia non perderà e raggiungerà i quadrilioni di dollari.
Esistono problemi più delicati, ad esempio cosa fai se effettui venti pagamenti? *, Ma questo dovrebbe iniziare.
* Calcola quale è un pagamento, arrotondato a long
; quindi moltiplicare per 20.0
e verificare che sia nell'intervallo; in tal caso, moltiplichi il pagamento 20L
per ottenere l'importo dedotto dal tuo saldo. In generale, tutte le transazioni devono essere gestite come long
, quindi è davvero necessario riassumere tutte le singole transazioni; puoi moltiplicare come scorciatoia, ma devi assicurarti di non aggiungere errori di arrotondamento e di non traboccare, il che significa che devi verificare con double
prima di fare il calcolo reale con long
.