具有getter的属性始终返回0

时间:2013-03-18 19:43:06

标签: c# asp.net-mvc getter-setter

这让我大吃一惊。我有这个类具有以下属性:

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。那里没有运气。

3 个答案:

答案 0 :(得分:12)

  

这让我大吃一惊。

多德。寒意。这一切都很好。

  

TotalQuestions等于2. TotalCorrect等于1.但分数始终为0.

好吧,自己做数学吧。什么整数最接近1/2,向零舍入?显然为零。什么是零乘以100?显然为零。所以答案是零。

问题是你正在使用全整数算术。整数除法四舍五入到最接近的整数,在你的方案中总是为零 - 除非正确答案的数量完全等于问题总数,在这种情况下它是一个。

解决问题的方法有两种,

首先,您可以先乘以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。

注意:使用十进制而不是 double 。如果你这样做,你不太可能遇到奇怪的舍入错误。请记住,十进制准确地表示分母包含2和5的任何权力组合的分数; double只能精确地表示分母为2的幂的分数。

如果您希望允许非整数分数,后一种算法可能更好。

答案 1 :(得分:4)

您将整数除以整数,因此结果为整数。由于结果为0.5,因此为0的整数。

首先将操作数转换为double(或decimal):

( TotalCorrect / (double)TotalQuestions ) * 100;

答案 2 :(得分:2)

您正在划分整数,结果将被截断为零。将第一个转换为float或double。

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