문제

이 질문은 이미 여기에 답이 있습니다.

나는 C#에서 더블을 사용하는 사람들을 계속보고 있습니다. 나는 두 배가 때때로 정밀도를 잃는 곳을 읽는다는 것을 알고 있습니다. 내 질문은 언제 두 배를 사용해야하고 언제 소수점 유형을 사용해야합니까? 돈 계산에 적합한 유형은 무엇입니까? (예 : 1 억 달러 이상)

도움이 되었습니까?

해결책

돈을 위해 언제나 소수. 그것이 만들어진 이유입니다.

숫자가 올바르게 추가되거나 균형을 유지 해야하는 경우 소수점을 사용하십시오. 여기에는 재무 저장 또는 계산, 점수 또는 사람들이 손으로 할 수있는 기타 번호가 포함됩니다.

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

다른 팁

내 질문은 언제 두 배를 사용해야하고 언제 소수점 유형을 사용해야합니까?

decimal 10^(+/- 28) 범위의 값과 기본적으로 돈을 기준으로 행동에 대한 기대치가있는 경우.

double 필요할 때 상대적인 크게 다른 크기에 걸쳐 정확도 (즉, 큰 값의 후행 숫자의 정밀도를 잃는 것은 문제가되지 않습니다) - double 10^(+/- 300) 이상을 덮습니다. 과학적 계산이 가장 좋은 예입니다.

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

소수, 소수, 소수

대체물을 수락하지 마십시오.

가장 중요한 요소는 double, 이진 분획으로 구현되면 많은 사람들이 정확하게 표현할 수 없습니다. decimal 분수 (0.1) 조금도 그리고 전체 숫자 수는 64 비트 너비와 128 비트이기 때문에 더 작습니다. decimal. 마지막으로, 재무 신청은 종종 구체적으로 따라야합니다 반올림 모드 (때때로 법에 의해 의무화됨). decimal 이것들을 지원합니다; double 하지 않습니다.

시스템 / 뜨다 -7 자리
System.Double / 더블 -15-16 자리
System.decimal / 소수 -28-29 중요한 숫자

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

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

당신은 플로트를 위해 백만으로 떨어집니다.

15 자리 화폐 값 :

  • £1,234,567,890,123.45

이중으로 9 조. 그러나 분열과 비교를 통해 그것은 더 복잡합니다 (나는 플로팅 포인트와 비이성적 인 숫자에 대한 전문가가 아닙니다. Marc의 요점을 참조하십시오). 소수점과 복식을 혼합하면 문제가 발생합니다.

부동 소수점 번호를 사용하는 수학적 또는 비교 작업은 부동 소수점 번호가 10 진수에 근접하지 않기 때문에 소수점 번호를 사용하는 경우 동일한 결과를 얻지 못할 수 있습니다.

10 진수 대신 두 배를 사용해야합니까? 비슷하고 더 깊이있는 답변이 있습니다.

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

소수점은 정확한 값을위한 것입니다. 이중은 대략적인 값입니다.

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을 가지고 있고 더블은 2가 2를 가지고 있다는 것입니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top