Aby zapisać swoją walutę longi obliczyć swoją walutę double, przynajmniej jako zapasową. Chcesz, aby wszystkie transakcje odbywały się jako long.
Powodem, dla którego chcesz przechowywać swoją walutę, longjest to, że nie chcesz stracić żadnej waluty.
Załóżmy, że używasz doublei 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 doublei Math.roundzdobą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.0i sprawdź, czy jest w zasięgu; jeśli tak, pomnóż płatność przez, 20Laby 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ć doubleprzed wykonaniem prawdziwych obliczeń long.