2013-03-18 38 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

這讓我非常震驚。

夥計。寒意。都很好。

TotalQuestions等於2 TotalCorrect等於1,但比分始終是0

嘛,你自己算一算。什麼整數最接近1/2,趨於零?顯然爲零。什麼是零乘以100?顯然爲零。所以答案是零。

問題是,你正在使用全整數運算。整數部分舍入到最接近的整數,在您的方案中始終爲零 - 除非正確答案的數目恰好等於問題總數,在這種情況下,它是1。

要解決這裏的問題有兩個方法,

首先,你可以通過100 第一繁殖,然後做了分工。

return (100 * TotalCorrect)/TotalQuestions; 

現在我們乘以100乘以1,得到100,除以2,得到50,完成。

或者你可以投的整數中的一個爲十進制,做小數運算,然後在最後將它轉換回整數:

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

現在我們把1〜1.0M,除以2得到0.5m,乘以100得到50.0m。然後再轉換爲int得到50

注意:使用小數而不是。如果你這樣做,你不太可能遇到奇怪的舍入誤差。請記住,小數部分準確地表示分母,其中分母包含兩個和五個冪的任意組合;雙精度只能精確地表示分母是2的冪的分數。

如果您希望允許非整數分數,後面的算法可能會更好。

+1

我想我有一些怎麼樣的getter和setter的根本誤解工作。原來,這是我的基本數學技能,需要工作! – 2013-03-18 19:50:25

+0

@ davidkennedy85:有人幾乎每天都會問這個問題。這是一個非常常見的「陷阱」。 – 2013-03-18 19:58:07

+0

我確定你是對的,並且對重複抱歉。但你怎麼去尋找這樣的事情? 「c#getter返回0」返回一百萬個不相關的問題。 「當它是一個int並且它基於另外兩個int類型的屬性時,c#getter返回0」也是很沒用的...... – 2013-03-18 20:01:20

2

您正在分割整數,結果被截斷爲零。將第一個轉換爲float或double。

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

不要忘記轉換回整數。 – 2013-03-18 19:56:36

4

您用一個整數除整數,所以結果是一個整數。由於結果是0.5,作爲一個整數0

只投其中一個操作數爲double(或decimal)第一名:

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

不要忘記退回到整數。 – 2013-03-18 19:57:36