2013-02-24 2 views
1

나는 메서드에 숫자를 전송하는 상황에서이 숫자를 6으로 나누고 숫자 6을 n 개의 항목으로 나눈 목록을 반환합니다. 나는 dictionary.count에서 나누는 숫자를 가져온다. 나는 그것을 반환하는 사전과 함께 리턴리스트를 결합한다. 반환 된 목록, 어떤 이유로 항상 올바른 수의 항목을 반환하지 않습니다. 그것은 12를 통해 잘 작동합니다.하지만 믿을만한 것이 아니라면 예측 가능합니다. 다음 숫자는 필요한 것보다 적은 1 개의 인덱스로 목록을 반환합니다 ... 13,15,18,23,25,20,27,28,30 ..... 아래 코드는 더 큰 프로젝트에서 가져 왔습니다. 당신이 기본이라는 텍스트 박스, 라벨과 버튼으로 폼에이 코드를 추가하는 경우이중 정밀도?

public void DivTest() 
{ 
    double value; 
    Double.TryParse(textBox1.Text, out value); 

    double div = 6/value; 
    int count = 1; 

    StringBuilder sb = new StringBuilder(); 

    for (double d = div; d <= 6; d += div) 
    { 
     sb.Append(count.ToString()).Append(" : ") 
      .Append(d.ToString("0.0000")).Append(" : ")                                
      .Append(div.ToString("0.0000")).AppendLine(); 

     count++; 
    } 

    label1.Text = sb.ToString(); 
} 

, 아마 중 하나를 당신과 함께 제대로 작동하지 않습니다. 마지막 줄은 항상 6이어야하지만, 내가 언급 한 숫자가 그 것이다. 반올림 문제라고 생각했지만이 예제에서는 반올림을 사용하지 않았습니다. 어떤 아이디어? 감사.

+0

부동 소수점으로 .7-.4-.3! = 0.0이므로 부동 소수점을 사용하지 말 것을 제안합니다. 6 개 항목을 계산하려면 정수를 사용하여 이들을 계산하는 것이 좋습니다. – Sean

+0

"...이 예제에서는 반올림을 사용하지 않습니다." 'double'을 사용한다면 항상 라운딩을 사용합니다. '6/value'를 쓸 때 얻을 수있는 결과는 실수가 아닌 6 ÷ 값과 정확히 같지 않을 수 있습니다. 정확한 결과 대신 가장 가까운 double 값으로 반올림됩니다. 'd + = div'를 할 때도 똑같은 일이 일어난다. –

답변

3

반올림 문제이거나 제한된 정밀도의 문제입니다.

나누기를 할 때 반올림이 발생합니다. 결과를 정확히 표현할 수 없으며 정밀도에 의해 제한됩니다.

결과를 반올림하면 추가 할 때 약간 큰 숫자가됩니다 (예 : 6.000000000000001, 6 대신). 6보다 크면 마지막 반복을 입력하지 않습니다. 고리.

루프에 정수 변수를 사용하여 1에서 value까지 반복하여이 문제를 해결할 수 있습니다.

+0

또 다른 대안은 두 배를 비교할 때 엡실론 값을 사용하는 것입니다. 그러나 가능한 경우 정수 루프 인덱스를 사용하는 것이 더 낫다는 것에 동의합니다. –