Program Tip

십진수 대 두 배!

programtip 2020. 9. 28. 09:57
반응형

십진수 대 두 배! -어느 것을 언제 사용해야합니까? [복제]


이 질문에 이미 답변이 있습니다.

나는 C #에서 복식을 사용하는 사람들을 계속 봅니다. 나는 때때로 두 배가되는 곳을 읽었다는 것을 알고있다. 내 질문은 언제 double을 사용해야하고 언제 10 진수 유형을 사용해야합니까? 돈 계산에 적합한 유형은 무엇입니까? (즉, 1 억 달러 이상)


돈을 위해 항상 소수. 그것이 만들어진 이유입니다.

숫자가 올바르게 합산되거나 균형이 맞춰져야하는 경우 십진수를 사용하십시오. 여기에는 사람들이 손으로 할 수있는 재정적 저장이나 계산, 점수 또는 기타 숫자가 포함됩니다.

숫자의 정확한 값이 중요하지 않은 경우 속도를 위해 double을 사용하십시오. 여기에는 이미 "유효 자릿수"가있는 그래픽, 물리학 또는 기타 물리 과학 계산이 포함됩니다.


내 질문은 언제 double을 사용해야하고 언제 10 진수 유형을 사용해야합니까?

decimal 10 ^ (+/- 28) 범위의 값으로 작업하고 기본 10 표현을 기반으로 한 행동에 대한 기대가있는 경우-기본적으로 돈입니다.

double10 ^ (+/- 300) 이상을 포함하는 매우 다양한 크기에서 상대적 정확도 가 필요할 때 (즉, 큰 값에서 후행 숫자의 정밀도를 잃는 것은 문제가되지 않습니다 double). 과학적 계산이 여기에 가장 좋은 예입니다.

돈 계산에 적합한 유형은 무엇입니까?

십진수, 십진수 , 십진수

대체물을 받아들이지 마십시오.

가장 중요한 요소는 double이진 분수로 구현 될 때 많은 decimal분수 (예 : 0.1) 를 전혀 정확하게 나타낼 수 없으며 전체 자릿수가 64 비트와 decimal. 마지막으로, 재무 응용 프로그램은 종종 특정 반올림 모드 를 따라야 합니다 (때로는 법률에 의해 요구됨). decimal 이들을 지원합니다 ; double하지 않습니다.


System.Single / float -7 자리
System.Double / double -15-16 자리
System.Decimal / 십진수 -28-29 유효 숫자

내가 잘못된 유형 (몇 년 전)을 사용하여 찔린 방식은 많은 양입니다.

  • £ 520,532.52-8 자리
  • £ 1,323,523.12-9 자리

당신은 부유물을 위해 1 백만을 다합니다.

15 자리 금전적 가치 :

  • 1,234,567,890,123.45 파운드

두 배로 9 조. 그러나 나누기와 비교를 사용하면 더 복잡합니다 (저는 부동 소수점과 비합리적인 숫자에 대한 전문가가 아닙니다 -Marc의 포인트 참조 ). 소수와 복식을 혼합하면 다음과 같은 문제가 발생합니다.

부동 소수점 숫자를 사용하는 수학 또는 비교 연산은 부동 소수점 숫자가 정확히 10 진수에 근접하지 않을 수 있으므로 10 진수를 사용하는 경우 동일한 결과를 생성하지 않을 수 있습니다.

소수점 대신 double을 언제 사용해야합니까? 유사하고 더 깊이있는 답변이 있습니다.

금전적 응용 프로그램double 대신에 사용 하는 것은 마이크로 최적화입니다. 이것이 제가 보는 가장 간단한 방법입니다.decimal


십진수는 정확한 값입니다. Double은 대략적인 값입니다.

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)

돈 : decimal. 약간 더 많은 메모리 비용이 들지만 double때로는 반올림 문제가 없습니다 .


확실히 당신의 돈 계산을위한 종류의 정수를 사용합니다. 언뜻 보면 부동 소수점 유형이 적절 해 보일 수 있으므로 충분히 강조 할 수 없습니다.

다음은 파이썬 코드의 예입니다.

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0

꽤 평범 해 보입니다.

이제 10 ^ 20 짐바브웨 달러로 다시 시도하세요

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

보시다시피 달러는 사라졌습니다.

정수 유형을 사용하면 정상적으로 작동합니다.

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1

비트 폭 외에 다른 점은 십진수는 밑 수가 10이고 double은 2라는 것입니다.

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html

참고URL : https://stackoverflow.com/questions/1165761/decimal-vs-double-which-one-should-i-use-and-when

반응형