1

次のコードを使用して、C++での数学ゲームの最終スコアを計算して表示しています。

int score = (correctNumber / 3) * 100;
cout << score;

変数「correctNumber」は常に0〜3の値です。ただし、「correctNumber」= 3でない限り、変数「score」は常に「0」に等しくなります。「correctNumber」が3に等しい場合、「score」は100に等しくなります。

「correctNumber」が2に等しいと言います。「スコア」は67にすべきではありませんか?これは、int変数タイプが小数点を計算できないという問題ですか?

4

4 に答える 4

7

あなたは整数として数学をしているので、1/3は0です。

試す:

int score = (100 * correctNumber) / 3

丸めたい場合:

int score = (100 * correctNumber + 1) / 3
于 2013-01-06T00:48:05.103 に答える
4

あなたが説明したことに基づいて、私はであると仮定しcorrectNumberています。int何が起こっているのかは整数の切り捨てです。をで割るintint、結果は常に切り捨てられます。

1/3 = 0.3333 = 0 as an integer
2/3 = 0.6667 = 0 as an integer
3/3 = 1.0000 = 1 as an integer

ここでこれを修正する簡単な方法は、最初に乗算することです。

int score = correctNumber * 100 / 3;

std::roundただし、これでも67ではなく66が2になります。C++ 11以降、これに対処するための明確で簡単な方法(および、丸めスタイルは構成できませんが、他の多くの丸め状況)が含まれています。

int score = std::round(currentNumber * 100. / 3);

この例では、ドットイン100.は(と同じものです)を作成100するため、操作の結果は、浮動小数点値として渡される事前に切り捨てられた値ではなく、必要な浮動小数点値になります。つまり、66の代わりに66.66666...に入ることになります。double100.0std::round

于 2013-01-06T00:54:41.083 に答える
2

あなたの推測は正しいです。int実数を保存することはできません。

しかし、最初に乗算してから除算することができます。

score = correctNumber * 100 / 3;

スコアは、の値に応じて0、33、66、100になりますcorrectNumber

于 2013-01-06T00:58:23.093 に答える
1

問題はそれ(correctNumber / 3)が整数であるため、0.666または100を掛ける分数を取得できないことです。これは、私が望むものだと私は信じています。

あなたはそれをこのように強制することを試みることができますfloat

int score = ((float)correctNumber / 3) * 100;

ただし、これにより、67ではなく66が得られます。これは、切り上げられないためです。そのためにC99を使用できますround()

int score = round(((float)correctNumber / 3) * 100);

アップデート:

+ 0.5次のように、丸めに使用することもできます。

int score = (correctNumber / 3.0f) * 100.0f + 0.5f;
于 2013-01-06T00:50:48.150 に答える