게임 내 통화에 어떤 데이터 유형을 사용해야합니까?


96

간단한 비즈니스 시뮬레이션 게임 (Java + Slick2D로 제작)에서 플레이어의 현재 금액을 a float또는 로 저장 int해야합니까?

유스 케이스에서 대부분의 거래는 센트 ($ 0.50, $ 1.20 등)를 사용하며 간단한 금리 계산이 포함됩니다.

float통화에 절대 사용해서는 안된다고 말하는 사람들과 통화에 절대 사용해서는 안된다고 말하는 사람들을 보았습니다 int. int필요한 백분율 계산을 사용 하고 반올림 해야한다고 생각합니다 . 무엇을 사용해야합니까?


2
이 질문은 StackOverflow에서 논의되었습니다. 아마도 BigDecimal처럼 보일 것입니다. stackoverflow.com/questions/285680/…
Ade Miller

2
Java에는 Currency델파이와 같은 유형이 없으며 스케일 고정 소수점 수학을 사용하여 부동 소수점 고유의 정밀도 문제없이 십진 수학을 제공합니까?
메이슨 휠러

1
게임이다. 회계는 반올림하여 돈을 버리지 않을 것이므로 통화에 부동 소수점을 사용하는 일반적인 이유는 중요하지 않습니다.
Loren Pechtel

@MasonWheeler : Java에는 BigDecimal이런 종류의 문제가 있습니다.
Martin Schröder

답변:


92

를 사용 int하고 모든 것을 센트 단위로 고려할 수 있습니다 . $ 1.20은 120 센트입니다. 표시 할 때 소수를 속한 곳에 넣습니다.

이자 계산은 잘 리거나 반올림됩니다. 그래서

newAmt = round( 120 cents * 1.04 ) = round( 124.8 ) = 125 cents

이렇게하면 항상 지저분한 소수가 붙어 있지 않습니다. 당신은 당신의 자신의 은행 계좌에 계산되지 않은 돈을 (내림차순으로) 추가함으로써 부를 얻을있습니다


3
을 (를) 사용 round하지 않을 이유 int가 없습니까?
sam hocevar

19
+1. 부동 소수점 숫자는 평등 비교를 어렵게 만들고 올바르게 형식을 지정하기가 어렵고 시간이 지남에 따라 반올림 오류가 발생합니다. 나중에 모든 것에 대해 불만을 갖지 않도록 모든 것을 스스로하는 것이 좋습니다. 정말 많은 일이 아닙니다.
Dobes Vandermeer

+1. 게임에가는 좋은 방법 인 것 같습니다. 나는 정수를 반올림하고 모든 플로트 문제를 피할 것입니다.
Lucas Tulio

면책 조항 : 나는 이것에 대한 정답을 바꿨습니다. 훨씬 간단하고 간단한 게임의 맥락에서 설명되지 않은 소수는 실제로 중요하지 않습니다.
Lucas Tulio

3
그러나 100 대신 10,000의 계수로 센트가 아닌 기본 포인트 (100 기본 포인트 = 1 센트)를 사용하십시오. 이것은 모든 재무, 은행 또는 회계 애플리케이션에 GAAP에 필요합니다.
Pieter Geerkens

66

좋아, 뛰어 들게

내 충고 : 그것은 게임이다. 쉽게 사용하십시오 double.

여기 내 근거가 있습니다 :

  • float수백만에 단위를 추가 할 때 나타나는 정밀도 문제가 있으므로 양성 일 수는 있지만 그 유형을 피할 것입니다. doublequintillons (10 억 억) 주위에서만 문제가 발생하기 시작합니다.
  • 당신이 금리를해야 할 것 때문에, 당신은 어쨌든 이론적으로 무한대의 정밀도가 필요합니다 : 4 %의 금리로, $ 100 다음 $ 104 $ 108.16, 다음 $ 112.4864,이 수 등이 될 것입니다 int그리고 long당신이 어디에와 중지하는 모르기 때문에 쓸모 소수점.
  • BigDecimal언젠가 정밀도를 고정하지 않으면 임의의 정밀도를 제공하지만 고통스럽게 느려집니다. 반올림 규칙은 무엇입니까? 어디에서 멈출지를 어떻게 선택합니까? 보다 정밀한 비트를 가질 가치가 double있습니까? 나는 믿지 않는다.

고정 소수점 산술이 재무 응용 프로그램에 사용되는 이유는 결정적이기 때문입니다. 반올림 규칙은 때때로 법에 의해 완벽하게 정의되며 엄격하게 적용되어야 하지만 반올림은 여전히 어느 시점에서 발생 합니다. 정밀도를 기반으로 주어진 유형을 선호하는 주장은 가짜 일 가능성이 높습니다. 모든 유형에는 수행하려는 계산 종류에 정밀한 문제가 있습니다.

실용적인 예

나는 동의하지 않는 반올림 또는 정밀도에 대해 주장하는 의견이 많이 있습니다. 여기에 내가 의미하는 바를 보여주는 몇 가지 추가 예가 있습니다.

저장 : 기본 단위가 센트이면 값을 저장할 때 가장 가까운 센트로 반올림하고 싶을 것입니다.

void SetValue(double v) { m_value = round(v * 100.0) / 100.0; }

이 방법을 채택 할 때 정수 유형이없는 반올림 문제는 절대 발생하지 않습니다.

검색 : 모든 계산은 변환없이 이중 값에서 직접 수행 할 수 있습니다.

double value = data.GetValue();
value = value / 3.0 * 12.0;
[...]
data.SetValue(value);

바꿀 경우 위의 코드가 작동하지 않습니다 doubleint64_t님의 암시 적 변환이있을 것이다 double, 다음 절단int64_tinformation.data.GetValue의 가능한 손실, ()

비교 : 비교는 부동 소수점 유형으로 올바르게 얻는 것입니다. 다음과 같은 비교 방법을 사용하는 것이 좋습니다.

/* Are values equal to a tenth of a cent? */
bool AreCurrencyValuesEqual(double a, double b) { return abs(a - b) < 0.001; }

반올림 공정성

이자율이 4 % 인 계정에 $ 9.99가 있다고 가정합니다. 정수로 반올림하면 $ 0.03을 얻을 수 있습니다. 부동 소수점 반올림으로 $ 0.04를 얻습니다. 나는 후자가 더 공정하다고 생각합니다.


4
+1. 내가 추가하고 싶은 유일한 설명은 금융 응용 프로그램이 미리 정의 된 특정 요구 사항을 준수하는 것과 마찬가지로 반올림 알고리즘도 마찬가지입니다. 게임이 카지노 게임 인 경우 유사한 표준을 준수하며 double은 옵션이 아닙니다.
Ivaylo Slavov

2
여전히 UI를 형식화하기 위해 반올림 규칙을 고려해야합니다. 백엔드가 UI와 동일한 정밀도를 사용하지 않을 때 비명을 지르고 점프하는 사람들을 다루지 않으려는 경우 게임을 스프레드 시트로 취급하려고하는 플레이어의 비율이 항상 있기 때문에 '정확하지 않은'결과가 표시되는 것이 가장 좋습니다. 고정 소수점 형식을 사용하는 것과 동일한 내부 및 외부 표현을 사용하는 것입니다. 성능이 문제가되지 않는 한이를 수행하기 위해 BigDecimal이 최선의 선택입니다.
Dan Neely

10
이 답변에 동의하지 않습니다. 반올림 문제가 나타나고 중단되는 경우 추가 반올림을 사용하지 않으면 $ 1.00가 갑자기 $ 0.99가 될 수 있습니다. 그러나 가장 중요한 것은 임의의 정밀도 소수점이 느리다는 것은 (거의) 완전히 관련이 없습니다. 우리는 거의 2013 년에 왔으며 수천 개의 숫자로 수백만 개의 숫자에 대해 큰 인수 분해, 삼각법 또는 대수를 수행하지 않는 한 성능 저하를 느끼지 못할 것입니다. 어쨌든, 단순이 항상 최선이므로 모든 숫자를 센트로 저장하는 것이 좋습니다. 그런 식으로 그들은 모두 int_64ts입니다.
Panda Pajama

8
@Sam 마지막으로 은행 계좌를 확인할 때 잔액이 .0000000000000001로 끝나지 않았습니다. 실제 통화 시스템은 나눌 수없는 단위와 함께 작동해야하며 정수로 올바르게 표시됩니다. 통화 분할을 올바르게 수행해야하는 경우 (실제 금융 세계에서는 전혀 공통적이지 않음) 돈을 잃지 않도록해야합니다. 예를 들어 10/3 = 3+3+4또는 10/3 = 3+3+3 (+1). 다른 모든 연산의 경우 모든 연산에서 반올림 문제가 발생할 수있는 부동 소수점과 달리 정수는 완벽하게 작동합니다.
Panda Pajama

2
@SamHocevar 999 * 4 / 100. 규정에 규정되어 있지 않은 경우 모든 반올림은 은행에 유리하게 수행된다고 가정합니다.
Dan Neely

21

Java ( float, double)의 부동 소수점 유형 은 한 가지 주된 이유로 통화에 대해 잘 표현되지 않습니다 . 반올림에 기계 오류 가 있습니다. 간단한 계산이 정수 반환하더라도 - 등 12.0/2(6.0), 부동 소수점 수도 잘못 (때문에 메모리에 이러한 유형의 특정 표현 THO) 그와 같은 원형 6.0000000000001또는 5.999999999999998유사한. 이는 프로세서에서 발생하는 특정 머신 반올림의 결과이며이를 계산 한 컴퓨터에 고유합니다. 일반적으로 이러한 값을 사용하여 작업하는 것은 거의 문제가되지 않습니다. 오류는 매우 무시할 수 있지만 사용자에게 표시하는 데 어려움이 있습니다.

이에 대한 가능한 해결책은과 같은 부동 소수점 데이터 유형의 사용자 정의 구현을 사용하는 것 BigDecimal입니다. 반올림 오류를 기계별로 구분하지 않고 성능 측면에서 느리게 분리하는 더 나은 계산 메커니즘을 지원합니다.

높은 생산성이 필요한 경우 간단한 유형을 사용하는 것이 좋습니다. 경우에 당신은 작동 중요한 재무 데이터각 센트는 그때 사용하도록 권하고 싶습니다 (외환 응용 프로그램 또는 일부 카지노 게임처럼) 중요하다 Longlong. Long많은 양과 좋은 정밀도를 처리 할 수 ​​있습니다. 소수점 이하 4 자리 숫자가 필요하다고 가정하면, 그 금액에 10000을 곱하는 것뿐입니다. 온라인 카지노 게임 개발 경험이 있으면 Long돈을 센트 단위로 나타내는 데 자주 사용되는 것으로 나타 났습니다 . Forex 응용 프로그램에서는 정밀도가 더 중요하므로 더 큰 승수가 필요합니다. 여전히 정수에는 기계 반올림 문제가 없습니다 (물론 3/2와 같이 수동 반올림은 스스로 처리해야 함).

허용 가능한 옵션은 표준 부동 소수점 유형을 사용하는 것입니다. Float그리고 Double성능이 정확도보다 100 % 센트보다 중요한 경우. 그런 다음 디스플레이 로직에서 사전 정의 된 형식 을 사용하면 잠재적 인 기계 반올림의 추악함이 사용자에게 표시되지 않습니다.


4
+1 세부 사항 : "소수점 다음에 4 자리 숫자가 필요하다고 가정하면 금액에 1000을 곱하면됩니다." 이것을 고정 점이라고합니다.
Laurent Couvidou

1
@Sam, 숫자는 예제 스테이크에 제공되었습니다. 아직도, 나는 개인적으로 그러한 간단한 숫자로 이상한 결과를 보았지만 빈번한 시나리오는 아닙니다. 부동 소수점이 재생 될 때이 현상이 발생할 가능성이 높지만 발견하기가 더 어려울 것입니다.
Ivaylo Slavov

2
@Ivaylo Slavov, 나는 당신에 동의합니다. 내 대답에 나는 방금 내 의견을했다. 나는 토론하고 옳은 일을 할 의지를 가지고 있습니다. 또한 귀하의 의견에 감사드립니다. :)
Md Mahbubur Rahman

1
@ SamHocevar : 그 추론이 모든 경우에 작동하지는 않습니다. 참조 : ideone.com/nI2ZOK
Samaursa

1
@ SamHocevar : 그것은 보장되지 않습니다. 여전히 정수 범위 내의 숫자는 첫 번째 부분에서 오류가 누적되기 시작합니다. ideone.com/AKbR7i
Samaursa

17

들어 작은 규모의 게임 어디 처리 속도, 메모리, 거기에 (때문에 정밀도 또는 수학 보조 프로세서로 작업을 천천히 고통스럽게 만들 수 있습니다에) 중요한 문제가 두 배로 충분하다.

그러나 대규모 게임 (예 : 소셜 게임) 및 프로세스 속도, 메모리에 제한이없는 경우 BigDecimal 이 더 좋습니다. 여기 때문에

  • 통화 계산의 경우 int 또는 long입니다.
  • float 및 double은 대부분의 기본 10 실수를 정확하게 나타낼 수 없습니다.

자원:

에서 https://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency

float와 double은 대부분의 기본 10 실수를 정확하게 나타낼 수 없기 때문입니다.

이것은 IEEE-754 부동 소수점 숫자의 작동 방식입니다. 부호를위한 비트, 지수를 저장하기위한 비트, 및 실제 분수를위한 나머지를 전용으로합니다. 이로 인해 숫자는 1.45 * 10 ^ 4와 비슷한 형태로 나타납니다. 기본이 10이 아니라 2입니다.

실제로 모든 실제 10 진수는 10의 거듭 제곱의 정확한 분수로 볼 수 있습니다. 예를 들어 10.45는 실제로 1045 / 10 ^ 2입니다. 그리고 일부 분수가 정확히 10의 거듭 제곱의 분수로 표현 될 수없는 것처럼 (1/3이 떠오름), 일부는 정확히 2의 거듭 제곱의 분수로 표현 될 수 없습니다. 간단한 예로, 부동 소수점 변수 안에 0.1을 저장할 수 없습니다. 0.0999999999999999996과 같은 가장 가까운 표현 가능한 값을 얻을 수 있으며 소프트웨어는 표시 할 때 0.1로 반올림합니다.

그러나 부정확 한 수에 대해 더하기, 빼기, 곱하기 및 나누기를 더 많이 수행하면 작은 오류가 더해짐에 따라 정밀도가 떨어집니다. 이것은 완벽한 정확성이 요구되는 돈을 다루기에는 플로트와 배가 부적절합니다.

Bloch, J., Effective Java, 2nd ed, 항목 48에서 :

The float and double types are particularly ill-suited for 

0.1 (또는 10의 다른 음의 거듭 제곱)을 float 또는 double로 정확하게 표현하는 것이 불가능하기 때문에 통화 계산.

For example, suppose you have $1.03 and you spend 42c. How much money do you have left?

System.out.println(1.03 - .42);

prints out 0.6100000000000001.

The right way to solve this problem is to use BigDecimal, 

통화 계산의 경우 int 또는 long입니다.

또한 봐


나는 작은 계산에 오래 걸리는 부분에만 동의하지 않습니다. 내 실제 경험에서, 그것은 좋은 정밀도와 많은 돈을 다룰만큼 충분히 입증되었습니다. 예, 사용하기가 약간 번거로울 수 있지만 두 가지 중요한 점에서 BigDecimal을 능가합니다-1) 빠릅니다 (BigDecimal은 소프트웨어 반올림을 사용합니다. BigDecimal은 정밀도를 잃지 않고 데이터베이스에서 유지하기가 더 어렵습니다. 모든 데이터베이스가 이러한 '사용자 정의'유형을 지원하는 것은 아닙니다. Long은 모든 주요 데이터베이스에서 잘 알려져 있으며 널리 지원됩니다.
Ivaylo Slavov

@Ivaylo Slavov, 실수해서 죄송합니다. 내 답변을 업데이트했습니다.
Md Mahbubur Rahman

:) 같은 문제에 대한 다른 접근 방법을 제공하는 데 필요한 어떤 사과하지
Ivaylo Slavov

2
@Ivaylo Slavov, 나는 당신에 동의합니다. 내 대답에 나는 방금 내 의견을했다. 나는 토론하고 옳은 일을 할 의지를 가지고 있습니다. 또한 귀하의 의견에 감사드립니다. :)
Md Mahbubur Rahman

이 사이트의 목적은 특정 시나리오에 따라 문제를 명확하게하고 OP가 올바른 결정을 내 리도록 돕는 것입니다. 우리가 할 수있는 일은 프로세스 속도를 높이는 것입니다. :)
Ivaylo Slavov

13

당신은 할 저장 에 통화를 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 달러 이상을 소비 할 수 있습니까? 오버플로는 여기서 재앙입니다.

그래서, 당신은 돈의 양을 계산 할 때마다 전송하는 사용 doubleMath.round그것은을 얻을 long. 그런 다음을 사용하여 잔액을 수정합니다 (두 계정 모두 추가 및 빼기) long.

당신의 경제는 유출되지 않으며 최대 1 조 달러까지 확장 될 것입니다.

더 까다로운 문제가 있습니다 (예 : 20 회 지불하면 어떻게합니까? *). 그러나이를 시작해야합니다.

* 당신은 하나의 지불이 무엇인지 계산, 반올림 long; 그런 다음 곱하고 20.0범위 내에 있는지 확인하십시오. 그렇다면 20L귀하의 잔액에서 차감 된 금액을 얻기 위해 지불에 곱하십시오 . 일반적으로 모든 거래는로 처리되어야 long하므로 실제로 모든 개별 거래를 요약해야합니다. 당신은 바로 가기로 증식 할 수 있지만, 당신은 당신이 반올림 오류를 추가하지 않도록해야 하고 당신이 당신이 확인해야 즉, 오버 플로우하지 않습니다 double와 실제 계산을하기 전에 long.


8

사용자에게 표시 될 수있는 모든 값은 거의 항상 정수 여야한다고 말하고 싶습니다. 돈은 이것의 가장 두드러진 예일뿐입니다. 900 HP를 가진 몬스터에게 225의 데미지를 4 번 입히고 여전히 1 HP의 남은 것을 발견하면 경험치에서 당신이 무언가를 줄 수있는 페니의 보이지 않는 부분이라는 것을 발견 할 것입니다.

더 기술적 인 측면에서 나는 관심있는 것과 같은 고급 작업을 수행하기 위해 수레로 되돌릴 필요가 없다는 점에 주목할 가치가 있다고 생각합니다. 선택한 정수 유형의 헤드 룸이 충분하다면 곱셈과 나눗셈이 소수점 이하의 곱셈을 의미합니다 (예 : 4 %를 반올림).

number=(number*104)/100

표준 규칙으로 반올림하여 4 %를 추가하려면 다음을 수행하십시오.

number=(number*104+50)/100

여기에 부동 소수점이 부정확하지 않습니다. 반올림은 항상 .5마크에 정확하게 분할됩니다 .

실제 질문 편집 :

논쟁은 내가 문제는 모든 무엇인지 요약하면에 대한 간단한보다 더 유용 할 수 있다고 생각하기 시작 갔다 어떻게보고 int/ float대답. 문제의 핵심은 데이터 유형에 관한 것이 아니라 프로그램의 세부 사항을 제어하는 ​​것입니다.

정수를 사용하여 정수가 아닌 값을 나타내면 프로그래머가 구현 세부 사항을 처리해야합니다. "어떤 정밀도를 사용해야합니까?" "어떻게 둥글게 할까?" 명시 적으로 답변해야하는 질문입니다.

반면에 플로트는 프로그래머가 걱정하도록 강요하지 않으며 이미 기대했던 것과 거의 비슷합니다. 그러나 float는 무한 정밀도가 아니기 때문에 일부 반올림이 발생하며 반올림은 예측할 수 없습니다.

한 번의 사용으로 어떤 일이 발생하고 반올림을 제어하고 싶습니까? 거의 불가능한 것으로 판명되었습니다. float를 실제로 예측 가능하게 만드는 유일한 방법은 전체로 표현할 수있는 값만 사용하는 것입니다 2^n. 그러나 그 구조는 수레를 사용하기 매우 어렵습니다.

따라서 간단한 질문에 대한 대답은 다음과 같습니다. 제어하려는 경우 정수를 사용하고 그렇지 않은 경우 float을 사용하십시오.

그러나 논쟁중인 질문은 또 다른 형태의 질문입니다. 통제를 원하십니까?


5

"게임 만"하더라도 Martin Fowler의 Money Pattern 을 사용 합니다.

왜?

현지화 (L10n) :이 패턴을 사용하면 게임 통화를 쉽게 현지화 할 수 있습니다. "Transport Tycoon"과 같은 오래된 타이쿤 게임에 대해 생각해보십시오. 이를 통해 플레이어는 실제 통화를 충족시키기 위해 게임 내 통화 (영국 파운드에서 미국 달러로)를 쉽게 변경할 수 있습니다.

긴 데이터 형식은 64 비트 부호있는 2의 보수 정수입니다. 최소값은 -9,223,372,036,854,775,808이며 최대 값은 9,223,372,036,854,775,807입니다 ( Java Tutorials ).

즉, 현재 M2 미국 머니 서플라이 9,000 배 (~ 10,000 억 달러)를 저장할 수 있습니다 . 당신에게 충분한 공간을 제공하는 것은 다른 어떤 세계 통화를 사용하는, 아마도, 심지어 한 사람은 / (궁금하면, 참조 인플레이션을 가지고 포스트 차 세계 대전 독일어 인플레이션 빵 1 파운드 3,000,000,000마르크 어디에)

긴, 매우 빠르게 유지하기 쉽고 해야 당신 만의 정수를 arithmetics를 사용하는 모든이자 계산을 할 수있는 충분한 공간을 제공, e 비즈니스의 대답은 그 작업을 수행하는 방법에 대한 설명을 제공합니다.


2

이것에 얼마나 많은 일을 하시겠습니까? 정확도는 얼마나 중요합니까? 반올림에서 발생하는 분수 오류와 이진 시스템에서 소수를 나타내는 부정확성을 추적하는 데 관심이 있습니까?

궁극적으로 나는 "코너 사례"와 알려진 문제가있는 사례에 대해 단위 테스트를 코딩하고 구현하는 데 약간의 시간을 소비하는 경향이 있습니다. 따라서 임의로 많은 양을 포괄하고 소수 비트를 BigDecimal 또는 BigRational 부분 (분모를위한 하나, 분자를위한 두 개의 BigInteger)-소수 부분을 주 BigInteger에 추가하여 분수 부분을 실제 분수 (아마도 주기적으로)로 유지하는 코드를 포함합니다. 그런 다음 부분적으로 GUI 계산에서 분수 부분을 유지하기 위해 모든 것을 센트 단위로 추적합니다.

아마도 (간단한) 게임을 위해 복잡한 방법 일지 모르지만 오픈 소스로 출판 된 라이브러리에는 적합합니다! 분수 비트를 다룰 때 성능을 좋게 유지하는 방법을 알아야합니다 ...


1

확실히 부유하지 않습니다. 7 자리 만 있으면 다음과 같은 정확도 만 갖습니다.

12,345.67 123,456.7x

이미 10 ^ 5 달러로 페니를 잃고 있습니다. double은 정확성 문제로 인해 실제 생활이 아닌 게임 목적으로 사용할 수 있습니다.

그러나 트랜잭션을 추적하고 요약하려는 경우 긴 (및 64 비트 또는 C ++의 긴 길이) 충분하지 않습니다. 회사의 순자산을 유지하는 것으로 충분하지만 1 년 동안의 모든 거래가 오버플로 될 수 있습니다. 그것은 당신의 재정 "세계"가 게임에서 얼마나 큰지에 달려 있습니다.


0

여기에 추가 할 또 다른 솔루션은 돈 클래스를 만드는 것입니다. 클래스는 다음과 같습니다 (심지어 구조체 일 수도 있음).

class Money
{
     string currencyType; //the type of currency example USD could be an enum as well
     bool isNegativeValue;
     unsigned long int wholeUnits;
     unsigned short int partialUnits;
}

이 경우 센트를 정수로 나타내고 전체 달러를 정수로 나타낼 수 있습니다. 음수라는 별도의 플래그가 있으므로 값에 부호없는 정수를 사용하여 가능한 양을 두 배로 늘릴 수 있습니다 (이 아이디어를 숫자에 적용하여 숫자가 큰 숫자 클래스를 작성하여 실제로 큰 숫자를 얻을 수 있음). 수학 연산자에 과부하가 걸리기 만하면 기존 데이터 유형처럼 사용할 수 있습니다. 더 많은 메모리를 차지하지만 실제로 값 제한을 확장합니다.

이것은 전체 단위당 부분 단위 수와 같은 것을 포함하도록 확장 될 수 있으므로 100 하위 단위 이외의 다른 단위,이 경우 센트 당 통화로 달러를 나눌 수 있습니다. 예를 들어 125 개의 플로피가 하나의 플 로퍼를 구성 할 수 있습니다.

편집하다:

나는 당신이 일종의 룩업 테이블을 가질 수 있고 머니 클래스가 다른 통화와 다른 통화에 대한 환율을 제공 할 수있는 액세스 할 수 있다는 아이디어를 확장 할 것입니다. 이를 연산자 오버로드 기능에 빌드 할 수 있습니다. 따라서 4 USD에 4 USD를 자동으로 추가하려고하면 자동으로 6.6 파운드를 씁니다 (작성시).



-1

클래스를 사용 하는 것이 가장 좋습니다. 당신은 돈의 구현을 숨길 수 있습니다 언제든지 당신이 원하는 것을 두 배로 / 길게 바꿀 수 있습니다.

class Money
{
    private long count;//Store here what ever you want in what type you want i suggest long or int
    //methods constructors etc.
    public String print()
    {
        return count/100.F; //convert this to string
    }
}

코드에서 단순히 getter를 사용하면 더 나은 방법으로 생각하고 더 유용한 방법을 저장할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.