당신은 할 저장 에 통화를 long
하고 계산 에 통화를 double
적어도 백업으로. 모든 거래가 로 수행 되기를 원합니다 long
.
통화를 저장하려는 이유 long
는 통화 를 잃고 싶지 않기 때문입니다.
를 사용하고 double
돈이 없다고 가정 해 봅시다 . 누군가 당신에게 세 가지 딤섬을주고 다시 가져옵니다.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
글쎄, 그것은 그렇게 시원하지 않다. 아마도 10 달러짜리 사람은 먼저 3 개의 딤을주고 다른 사람에게 19.7 달러를 줘서 재산을 포기하고 싶을 것입니다.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
그리고 당신은 그들에게 한푼도 돌려줍니다.
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
이것은 단지 고장났습니다.
이제 긴 것을 사용해 봅시다. 우리는 10 분의 1 센트를 추적 할 것입니다 (따라서 1 = $ 0.001). 지구상의 모든 사람들에게 십억, 십오 만, 칠십 오만, 십이 삼십 오 달러를 주겠습니다.
Us: 7000000000L*1112075143000L = 1 894 569 218 048
잠깐만 요, 우리는 모두에게 10 억 달러 이상을 줄 수 있고 단지 2 달러 이상을 소비 할 수 있습니까? 오버플로는 여기서 재앙입니다.
그래서, 당신은 돈의 양을 계산 할 때마다 전송하는 사용 double
및 Math.round
그것은을 얻을 long
. 그런 다음을 사용하여 잔액을 수정합니다 (두 계정 모두 추가 및 빼기) long
.
당신의 경제는 유출되지 않으며 최대 1 조 달러까지 확장 될 것입니다.
더 까다로운 문제가 있습니다 (예 : 20 회 지불하면 어떻게합니까? *). 그러나이를 시작해야합니다.
* 당신은 하나의 지불이 무엇인지 계산, 반올림 long
; 그런 다음 곱하고 20.0
범위 내에 있는지 확인하십시오. 그렇다면 20L
귀하의 잔액에서 차감 된 금액을 얻기 위해 지불에 곱하십시오 . 일반적으로 모든 거래는로 처리되어야 long
하므로 실제로 모든 개별 거래를 요약해야합니다. 당신은 바로 가기로 증식 할 수 있지만, 당신은 당신이 반올림 오류를 추가하지 않도록해야 하고 당신이 당신이 확인해야 즉, 오버 플로우하지 않습니다 double
와 실제 계산을하기 전에 long
.