2

これは私の心を吹き飛ばしています。次のプロパティを持つこのクラスがあります。

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 です。

他のプロパティが設定される前にスコアが設定されているのではないかと思ったので、これを試しました:

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

ビューで Score() を呼び出すまでに、他のプロパティが確実に設定されるため、これが機能すると考えました。しかし、それは0を返すだけです。

また、IEnumerable を IList に変更してみました。そこには運がありません。

4

3 に答える 3

13

これは私の心を吹き飛ばしています。

お前。チル。大丈夫だよー。

TotalQuestionsは2に等しいです。TotalCorrectは1に等しいです。しかし、スコアは常に0です。

さて、自分で数学をしてください。1/2に最も近い整数はどれですか?ゼロに向かって丸めますか?明らかにゼロ。ゼロに100を掛けたものは何ですか?明らかにゼロ。したがって、答えはゼロです。

問題は、すべて整数の算術を使用していることです。整数の除算は、シナリオでは常にゼロである最も近い整数に丸められます。正解の数が質問の総数と正確に等しい場合を除きます。この場合、整数は1になります。

ここで問題を解決するには、2つの手法があります。

まず、最初に100を掛けてから、除算を行うことができます。

return ( 100 * TotalCorrect )  / TotalQuestions;

ここで、100を1で乗算し、100を取得し、それを2で除算して、50を取得します。

または、整数の1つを小数にキャストし、小数で計算を実行してから、最後に整数にキャストし直すこともできます。

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

ここで、1を1.0mに変換し、2で割ると0.5mになり、100を掛けると50.0mになります。次に、それをintに変換して50を取得します。

doubleではなくdecimalを使用してください。そうすると、奇妙な丸め誤差が発生する可能性が低くなります。小数は、分母に2と5の累乗の任意の組み合わせが含まれる分数を正確に表すことを忘れないでください。doubleは、分母が2の累乗である分数のみを正確に表します。

整数以外のスコアを許可したい場合は、後者のアルゴリズムの方がおそらく優れています。

于 2013-03-18T19:44:31.440 に答える
4

整数を整数で割ると、結果は整数になります。結果は0.5なので、0の整数として。

double最初にいずれかのオペランドを(またはdecimal)にキャストするだけです。

( TotalCorrect / (double)TotalQuestions ) * 100;
于 2013-03-18T19:45:02.557 に答える
2

整数を除算していて、結果がゼロに切り捨てられています。最初のものをfloatまたはdoubleに変換します。

public int Score()
{
    return (int)(((float)TotalCorrect / TotalQuestions ) * 100);
}
于 2013-03-18T19:44:37.487 に答える