Aby zapisać swoją walutę long
i obliczyć swoją walutę double
, przynajmniej jako zapasową. Chcesz, aby wszystkie transakcje odbywały się jako long
.
Powodem, dla którego chcesz przechowywać swoją walutę, long
jest to, że nie chcesz stracić żadnej waluty.
Załóżmy, że używasz double
i nie masz pieniędzy. Ktoś daje ci trzy dziesięciocentówki, a następnie bierze je z powrotem.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Cóż, to nie jest takie fajne. Może ktoś z 10 $ chce przekazać swoją fortunę, najpierw dając ci trzy dziesięciocentówki, a następnie 9,70 $ komuś innemu.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
A potem oddajesz im dziesięciocentówki:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
To jest po prostu zepsute.
Teraz użyjmy długiego, a my będziemy śledzić dziesiąte centy (czyli 1 = 0,001 $). Dajmy każdemu na świecie miliard sto dwanaście milionów siedemdziesiąt pięć tysięcy sto czterdzieści trzy dolary:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Um, czekaj, możemy dać każdemu ponad miliard dolarów i wydać tylko nieco ponad dwa? Przepełnienie jest tutaj katastrofą.
Tak więc, ilekroć obliczasz kwotę, którą chcesz przelać, użyj jej double
i Math.round
zdobądź long
. Następnie napraw salda (dodaj i odejmij oba konta) za pomocą long
.
Twoja gospodarka nie wycieknie i zwiększy się do miliardów dolarów.
Są trudniejsze problemy - na przykład, co robisz, jeśli dokonujesz dwudziestu płatności? * - ale to powinno zacząć.
* Obliczasz, co to jest jedna płatność, w zaokrągleniu do long
; następnie pomnóż przez 20.0
i sprawdź, czy jest w zasięgu; jeśli tak, pomnóż płatność przez, 20L
aby uzyskać kwotę potrąconą z salda. Zasadniczo wszystkie transakcje muszą być obsługiwane jako long
, więc naprawdę trzeba podsumować wszystkie poszczególne transakcje; możesz pomnożyć jako skrót, ale musisz upewnić się, że nie dodajesz błędów zaokrąglania i nie przepełniasz, co oznacza, że musisz sprawdzić double
przed wykonaniem prawdziwych obliczeń long
.