C ++奇怪的变量问题

时间:2013-01-06 00:46:22

标签: c++ int

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

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

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

说“correctNumber”等于2.那么“得分”不应该是67吗?这是int变量类型无法计算小数点的问题吗?

4 个答案:

答案 0 :(得分:7)

你把数学作为整数,所以1/3是0。

尝试:

int score = (100 * correctNumber) / 3

如果你想圆?:

int score = (100 * correctNumber + 1) / 3

答案 1 :(得分:4)

我假设correctNumberint,基于您所描述的内容。发生的事情是整数截断。当您将int除以int时,结果将始终向下舍入:

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;

然而,这仍然留给你66,2,而不是67.一个明确和简单的处理方式(以及许多其他舍入情况,虽然舍入风格是不可配置的)是std::round,包括自C ++ 11:

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

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

答案 2 :(得分:2)

你的猜测是正确的。 int无法存储实数。

但是你可以先乘,然后再分开,比如

score = correctNumber * 100 / 3;

得分将为0,33,66,100,具体取决于correctNumber

的值

答案 3 :(得分: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.5进行舍入,如下所示:

int score = (correctNumber / 3.0f) * 100.0f + 0.5f;