这让我大吃一惊。我有这个类具有以下属性:
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。那里没有运气。
答案 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);
}