带有getter的属性总是返回0

本文关键字:返回 属性 getter 带有 | 更新日期: 2023-09-27 18:04:45

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

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。但是Score总是0。

我想也许Score是在其他属性设置之前设置的,所以我尝试了这个:

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

我认为这会起作用,因为当我在视图中调用Score()时,其他属性肯定已经设置好了。但是它只返回0

我还尝试将IEnumerable更改为illist。

带有getter的属性总是返回0

这让我很震惊。

伙计。严寒。一切都很好。

TotalQuestions等于2。TotalCorrect等于1。但是Score总是0。

好吧,你自己算算。哪个整数最接近1/2,向零四舍五入?显然零。0乘以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。然后将其转换为整型得到50。

注意: 使用十进制的两倍。如果这样做,就不太可能遇到奇怪的舍入错误。记住,小数精确地表示分母包含2和5的任意幂组合的分数;Double只准确地表示分母为2的幂的分数。

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

你用一个整数除以另一个整数,所以结果是一个整数。因为结果是0.5,所以作为一个整数等于0。

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

( TotalCorrect / (double)TotalQuestions ) * 100;

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

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