Sen istiyoruz saklamak da para long
ve hesaplamak da para double
en az bir yedek olarak. Tüm işlemlerin olarak yapılmasını istiyorsunuz long
.
Para birimini saklamak istemenizin nedeni, para birimini long
kaybetmek istememenizdir.
Diyelim ki a kullanıyorsunuz double
ve paranız yok. Birisi size üç dimes verir ve sonra onları geri alır.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Bu hiç hoş değil. Belki de 10 doları olan biri, ilk önce size üç dim vererek ve ardından başkalarına 9,70 dolar vererek servetini vermek ister.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
Sonra onlara dimeleri geri veriyorsun:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
Bu daha yeni bozuldu.
Şimdi, uzun süre kullanalım, onuncu sentin izini sürelim (yani 1 = 0,001 $). Herkese gezegende bir milyar, yüz on iki milyon, yetmiş beş bin, yüz kırk üç dolar verelim:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Bekle, herkese bir milyar dolardan fazla verebiliriz ve sadece ikiden biraz fazla harcayabiliriz. Taşma burada bir felakettir.
Yani, bir miktar parayı hesaplayarak konum zaman transfer etmek, kullanım double
ve Math.round
o almak long
. Sonra kullanarak bakiyeleri düzeltin (her iki hesabı da ekleyin ve çıkarın) long
.
Ekonominiz sızmayacak ve katrilyon dolara yükselecek.
Daha zor meseleler var - örneğin, yirmi ödeme yaparsanız ne yaparsınız? * - ama bu başlamanız gerekir.
* Bir ödemenin ne kadar olduğunu hesaplarsınız long
; daha sonra çarpınız 20.0
ve menzilde olup olmadığını kontrol ediniz; öyleyse, 20L
bakiyenizden düşülen tutarı almak için ödemeyi çarpın . Genel olarak, tüm işlemlerin şu şekilde yapılması gerekir; long
bu nedenle , tüm işlemleri tek tek toplamanız gerekir; kısayol olarak çoğaltabilirsiniz, ancak yuvarlama hataları eklemediğinizden ve taşmadığınızdan emin olmanız gerekir; double
bu, gerçek hesaplamayı yapmadan önce kontrol etmeniz gereken anlamına gelir long
.