少なくともバックアップとして、通貨をに格納し、通貨long
を計算しますdouble
。すべてのトランザクションをとして実行する必要がありlong
ます。
通貨を保管する理由long
は、通貨を失いたくないからです。
を使用しdouble
、お金がないとしましょう。誰かがあなたに3ダイムを与え、そしてそれらを取り戻します。
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
まあ、それはそれほどクールではありません。たぶん、10ドルの人は、最初に3ダイムを渡してから、9.70ドルを他の人に渡して、自分の財産を渡したいと思うかもしれません。
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
そして、あなたは彼らに10セントを返します:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
これは壊れています。
ここで、長い値を使用して、10分の1セント(1 = $ 0.001)を追跡します。地球上のすべての人に10億、1億1,200万、75,000、143ドルを与えましょう。
Us: 7000000000L*1112075143000L = 1 894 569 218 048
ええと、待ってください、私たちは10億ドル以上を誰にでも与えることができます、そして、わずか2つ以上を使うでしょうか?ここでオーバーフローは災害です。
したがって、送金する金額を計算するときはいつでもdouble
、Math.round
それを使用してを取得しlong
ます。次に、を使用して残高を修正します(両方のアカウントを加算および減算します)long
。
あなたの経済は漏れません、そして、それは1兆ドルまで拡大します。
さらに注意が必要な問題があります。たとえば、20回の支払いを行う場合はどうしますか。
* 1回の支払いが何であるかを計算しlong
ます。次に乗算し20.0
て範囲内にあることを確認します。もしそうなら、あなた20L
はあなたの残高から差し引かれる量を得るためにあなたに支払いを掛けます。通常、すべてのトランザクションはとして処理する必要があるlong
ため、個々のトランザクションをすべてまとめる必要があります。ショートカットとして乗算できますが、丸めエラーを追加しないようにし、オーバーフローしないようにする必要があります。double
つまり、で実際の計算を行う前に確認する必要がありますlong
。