带有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。
这让我很震惊。
伙计。严寒。一切都很好。
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);
}