2013-03-18 2 views
2

이것은 내 마음을 불고 있습니다. 나는 다음과 같은 속성이 클래스가 :getter가있는 속성은 항상 0을 반환합니다.

여기
public IEnumerable<QuestionModel> Questions { get; set; } 

public int TotalQuestions 
{ 
    get 
    { 
     return Questions.Count(); 
    } 
} 

public int TotalCorrect 
{ 
    get 
    { 
     return Questions.Count(x => x.Correct); 
    } 
} 

public int Score 
{ 
    get 
    { 
     return (TotalCorrect/TotalQuestions) * 100; 
    } 
} 

내가 컨트롤러에서 모델 생성 방법은 다음과 같습니다

var model = new QuizModel 
    { 
     Questions = new List<QuestionModel> 
      { 
       new QuestionModel 
        { 
         Correct = true 
        }, 
       new QuestionModel 
        { 
         Correct = false 
        } 
      } 
    }; 

TotalQuestions 2. TotalCorrect 동일를 1로 동일하지만 점수는 항상 0입니다 .

나는 생각 어쩌면 다른 속성이 설정되기 전에 설정 한 점수, 그래서 나는이 시도 :

public int Score() 
{ 
    return (TotalCorrect/TotalQuestions) * 100; 
} 

내가 볼 때 Score()라고 불렀을 때 다른 속성이 확실히 설정 될 것이기 때문에이 방법이 효과가 있다고 생각했습니다. 하지만 그냥 0을 반환합니다.

또한 IEnumerable을 IList로 변경해 보았습니다. 운이 없다.

답변

11

이것은 내 마음을 불고 있습니다.

Dude. 냉기. 전부다 괜찮아. 2. TotalCorrect 1. 동일하지만 점수는 0

글쎄, 수학 너 자신을 항상에

TotalQuestions은 동일합니다. 어떤 정수가 1/2에 가장 가깝고 0으로 반올림됩니까? 분명히 0입니다. 0을 곱한 값은 무엇입니까? 분명히 0입니다. 그래서 대답은 0입니다.

문제는 입니다. 정수형 산술을 사용하고 있습니다. 정수 부분은 가장 가까운 정수로 반올림됩니다.이 정수는 시나리오에서 항상 0입니다. 정답 수가 총 질문 수와 정확히 일치하지 않는 한 (1 인 경우)

여기에 두 가지 기술,

첫째, 당신은 100 처음에 의해 증식하고 분열을 할 수있는이 문제를 해결하려면.

return (100 * TotalCorrect)/TotalQuestions; 

이제 100을 1로 곱하고, 100을 얻고, 2로 나누고, 50을 얻습니다.

아니면 진수로 정수 중 하나를 던져 소수의 계산을 수행 한 후 마지막에 정수로 다시 캐스팅 수 :

public int Score() 
{ 
    return (int)(((decimal)TotalCorrect/TotalQuestions) * 100); 
} 

이제 우리는에 의해 1.0M, 분할 1로 변환 2로 0.5m, 100으로 곱하면 50.0m가됩니다. 그런 다음이 50

를 얻기 위해 int로 변환 : 진수하지 더블 사용합니다. 그렇게하면 이상한 반올림 오류가 발생할 가능성이 적습니다. 10 진수는 분모가 2와 5의 거듭 제곱의 조합을 포함하는 분수를 정확하게 나타냅니다. double은 분모가 2의 거듭 제곱 인 분수를 정확하게 나타냅니다.

정수가 아닌 점수를 허용하려는 경우, 후자의 알고리즘이 더 좋습니다.

+1

내가 어떻게 getter 및 setter의 근본적인 오해의 어떤 줄 알았는데 작업. 그것이 작업을 필요로하는 나의 기본적인 수학 능력 이었어! –

+0

@ davidkennedy85 : 누군가가 거의 매일 이렇게 묻습니다. 매우 일반적인 "잡았다". –

+0

나는 네가 옳은 것 같아. 그리고 그 사본을 유감스럽게 생각한다. 그러나 그런 일을 찾는 방법에 대해 어떻게 생각하세요? "C# getter returns 0"은 관련없는 백만 가지 질문을 반환합니다. "C# getter는 int 일 때 0을 반환하고 int 인 두 개의 다른 속성을 기반으로합니다."또한 매우 쓸모가 없습니다. –

2

정수를 나눌 때 결과가 0으로 잘립니다. 첫 번째를 float 또는 double로 변환하십시오.

public int Score() 
{ 
    return (int)(((float)TotalCorrect/TotalQuestions) * 100); 
} 
+1

정수로 다시 캐스트하는 것을 잊지 마십시오. –

4

정수를 정수로 나눕니다. 결과는 정수입니다. 결과가 정수로, 0.5이기 때문에 0

그냥 먼저 double (또는 decimal)에 피연산자 캐스트 :

(TotalCorrect/(double)TotalQuestions) * 100; 
+0

정수로 다시 캐스트하는 것을 잊지 마십시오. –

관련 문제