1

我正在使用以下代码来计算和显示 C++ 数学游戏的最终分数。

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

变量“correctNumber”始终是介于 0 和 3 之间的值。但是,除非“correctNumber”=3,否则变量“score”始终等于“0”。当“correctNumber”等于 3 时,“score”等于 100。

说“correctNumber”等于 2。那么“score”不应该是 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发生的是整数截断。当您将 anint除以 anint时,结果总是向下舍入:

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;

但是,这仍然为 2 留下 66,而不是 67。std::round从 C++11 开始,一种清晰而简单的处理方法(以及许多其他舍入情况,尽管舍入样式不可配置)是:

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

在示例中,点中的点100.构成100a double(与 相同100.0),因此运算的结果将是您想要的浮点值,而不是作为浮点值传入的预截断值。这意味着您最终会得到 66.66666...std::round而不是 66。

于 2013-01-06T00:54:41.083 回答
2

你的猜测是正确的。int不能存储实数。

但是你可以先乘,然后除,比如

score = correctNumber * 100 / 3;

score 将有 0、33、66、100,具体取决于correctNumber

于 2013-01-06T00:58:23.093 回答
1

问题是它(correctNumber / 3)是一个整数,所以你不能得到 0.666 或任何分数乘以 100,我相信这是你想要的。

你可以尝试强迫它是float这样的:

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

然而,这会给你 66 而不是 67,因为它不会四舍五入。您可以为此使用 C99 round()

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

更新:

你也可以使用+ 0.5to round ,像这样:

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