문제

나는 항상 C#에서 유형의 변수는 돈에 적합하지 않다고 말합니다. 모든 이상한 일이 일어날 수 있습니다. 그러나 이러한 문제 중 일부를 보여줄 예제를 만들 수없는 것 같습니다. 누구든지 그러한 예를 제공 할 수 있습니까?

(편집;이 게시물은 원래 C#에 태그를 지정했습니다. 일부 답변은 특정 세부 정보를 나타냅니다. decimal, 따라서 이는 의미합니다 System.Decimal).

(편집 2 : 나는 c# 코드를 요구하는 구체적 이었으므로 이것이 언어가 불가지론 적 전용이라고 생각하지 않습니다)

도움이 되었습니까?

해결책

매우 부적합합니다. 소수점을 사용하십시오.

double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false

(Jon의 페이지의 예 여기 - 권장 독서; -P)

다른 팁

반올림으로 인해 효과적으로 홀수 오류가 발생합니다. 또한 정확한 값과의 비교는 매우 까다 롭습니다. 일반적으로 실제 값이 특정 값에 가까운지 확인하기 위해 일종의 엡실론을 적용해야합니다.

구체적인 예는 다음과 같습니다.

using System;

class Test
{
    static void Main()
    {
        double x = 0.1;
        double y = x + x + x;
        Console.WriteLine(y == 0.3); // Prints False
    }
}

예, 부적합합니다.

내가 올바르게 기억한다면 두 배가 약 17 개의 상당한 숫자를 가지고 있으므로 일반적으로 반올림 오류는 소수점 뒤에서 발생합니다. 대부분의 금융 소프트웨어는 10 진수 지점 뒤에 4 개의 소수점을 사용하여 13 개의 소수점을 사용하여 일할 수 있으므로 단일 운영을 위해 작업 할 수있는 최대 수는 여전히 미국 국가 부채보다 훨씬 높습니다. 그러나 반올림 오류는 시간이 지남에 따라 추가됩니다. 소프트웨어가 오랫동안 실행되면 결국 센트를 잃게됩니다. 특정 작업은 이것을 악화시킬 것입니다. 예를 들어 많은 양에 많은 양을 추가하면 상당한 정밀도 손실이 발생합니다.

돈 운영을 위해 고정 포인트 데이터 유형이 필요합니다. 대부분의 사람들은 여기 저기 센트를 잃어도 신경 쓰지 않지만 회계사는 대부분의 사람들과 다릅니다 ..

편집하다
이 사이트에 따르면 http://msdn.microsoft.com/en-us/library/678hzkk9.aspx 복식은 실제로 17 대신 15 ~ 16 자리를 가지고 있습니다.

@Jon Skeet Decimal은 더 높은 정밀, 28 또는 29의 중요한 소수로 인해 두 배보다 더 적합합니다. 이는 축적 된 반올림 오류가 발생할 가능성이 줄어 듭니다. Boojum 언급과 같이 고정 포인트 데이터 유형 (예 : 내가 본 것과 같이 센트 또는 100 번째 센트를 나타내는 정수)은 실제로 더 적합합니다.

부터 decimal 10의 배수의 스케일링 계수를 사용하며 0.1과 같은 숫자를 정확하게 표시 할 수 있습니다. 본질적으로, 소수점 유형은 이것을 1 / 10 ^ 1로 나타내는 반면 double 이것을 104857 / 2 ^ 20으로 표시합니다 (실제로는 더 비슷합니다. 정말 자녀 / 2 ^ 1023).

decimal 최대 28/29 숫자 (0.1)의 기본 10 값을 정확하게 나타낼 수 있습니다. ㅏ double 캔트.

내 이해는 대부분의 금융 시스템이 정수를 사용하여 통화를 표현한다는 것입니다. 즉, 모든 것을 센트로 계산합니다.

IEEE 이중 정밀도 ~할 수 있다 모든 정수를 -2^53 ~ +2^53 범위에서 정확하게 나타냅니다. (해커의 기쁨, 262 페이지) 추가, 뺄셈 및 곱셈 만 사용 하고이 범위 내에서 모든 것을 정수로 유지하면 정밀도가 손실되지 않아야합니다. 그러나 나는 분열이나 더 복잡한 운영에 매우주의를 기울일 것입니다.

당신이 무엇을하고 있는지 모를 때 더블을 사용하는 것은 부적합합니다.

"이중"은 1/90으로 오류가있는 1 조 달러의 금액을 나타낼 수 있습니다. 따라서 매우 정확한 결과를 얻을 수 있습니다. 남자를 화성에 올려 놓고 그를 다시 살아주는 데 드는 비용을 계산하고 싶습니까? 더블은 괜찮을 것입니다.

그러나 돈을 사용하면 특정 계산이 특정 결과와 다른 결과를 제공해서는 안된다는 매우 구체적인 규칙이 있습니다. $ 98.135에 매우 매우 가까운 금액을 계산하면 결과가 $ 98.14 또는 $ 98.13 여부를 결정하는 규칙이 종종 있습니다. ~ 해야 하다 그 규칙을 따르고 필요한 결과를 얻으십시오.

거주 지역에 따라 64 비트 정수를 사용하여 센트 또는 페니 또는 코프크를 나타내거나 귀하의 나라에서 가장 작은 단위가 일반적으로 잘 작동합니다. 예를 들어, 센트를 나타내는 64 비트 서명 정수는 최대 92,223 조 달러의 값을 나타낼 수 있습니다. 32 비트 정수는 일반적으로 부적합합니다.

이중은 항상 반올림 오류가 없으며 .NET에있는 경우 "10 진수"를 사용하십시오 ...

실제로 부동 소수점 더블 적합한 단위를 선택하는 한 많은 돈을 대표하는 데 완벽하게 적합합니다.

보다 http://www.idinews.com/moneyrep.html

고정점도 마찬가지입니다 . 8 바이트를 소비하며 소수 안건.

무언가가 효과가 있는지 여부 (즉, 예상 및 올바른 결과를 산출 함)는 투표 나 개인 선호도의 문제가 아닙니다. 기술은 작동하거나 그렇지 않습니다.

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