2011-11-11 3 views
3

나는 확률로 작업하며 값의 합이 1인지 확인해야합니다. 단위 테스트를 작성하고 테스트 중 하나가 실패했습니다. 0.4 + 0.3 + 0.2 + 0.1 = 1 :숫자의 합을 1과 같게 만드는 방법

double[] probabilities = new[] { 0.4, 0.3, 0.2, 0.1 }; 
double sum = probabilities.Sum(); 
//On my PC gives sum of 0.99999999999999989 

if (sum != 1) 
{ 
    throw new ArgumentException(
     "Sum of the probabilities does not equal to 1. " + 
     "Computed value was: " + sum); 
} 

어떻게 변경할 수는이 사실을 만들기 위해 : 그것은 실패 된 이유는 무엇입니까?

+0

'if (sum! = 1.0)' –

+0

또 다른 방법은 int를 사용하는 것입니다. 확률에 100을 곱하십시오 (0.4 -> 40). 그런 다음 당신은'sum! = 100'을 확인할 수 있습니다 –

+0

@razbakov 확률은 일반적으로 [0,1]의 값으로 사용되므로 int를 사용할 수 없습니다. – oleksii

답변

6

double은 이러한 종류의 수학에 필요한 정밀도를 제공하지 않습니다.

decimal으로 전환하면 모두 정상적으로 작동합니다.

+0

그러나 십진수로 완전한 확률 논리를 다시하고 싶지는 않을 것입니다 ... –

+0

@Henk Holterman - 원하지 않을 수도 있지만, 그 숫자로 정확한 계산을 원한다면,해야 할 것입니다. OP는 또한 단위 테스트 프레임 워크를 언급하지 않습니다. –

+0

방금 ​​확인해 주셨습니다. 저를 위해 일했습니다. Tnx! 일부 논리를 다시 작성해야합니다 – oleksii

1

decimal은 원하는 정밀도를가집니다. 기본 정밀도가 필요한 경우 decimal으로 고정하십시오. What Every Computer Scientist Should Know About Floating-Point Arithmetic

+1

[이진 부동 소수점] (http://csharpindepth.com/Articles/General/FloatingPoint.aspx) 및 [소수점 부동 소수점]에 대한 Jon Skeet의 C# 기사 참조 (http://csharpindepth.com /Articles/General/Decimal.aspx). – Brian

1

거의 모든 단위 테스트 시스템은 두 값이 일부 지정된 허용 오차 내에 있는지 "친밀감"에 대한 복식을 확인 어설가 : 여기

는 주제에 대한 이전하지만, 관련 기사입니다. 예를 들어, NUnit Assert.AreEqual에는 실제 값, 예상 값 및 처음 두 값이 Assert가 전달할 수있는 최대 값인 델타 값을 전달하는 오버로드가 있습니다.

관련 문제