我正在使用以下代码计算并显示C ++中数学游戏的最终得分。
int score = (correctNumber / 3) * 100;
cout << score;
变量“correctNumber”始终是介于0和3之间的值。但是,除非“correctNumber”= 3,否则变量“score”始终等于“0”。当“correctNumber”等于3时,“得分”等于100.
说“correctNumber”等于2.那么“得分”不应该是67吗?这是int变量类型无法计算小数点的问题吗?
答案 0 :(得分:7)
你把数学作为整数,所以1/3是0。
尝试:
int score = (100 * correctNumber) / 3
如果你想圆?:
int score = (100 * correctNumber + 1) / 3
答案 1 :(得分:4)
我假设correctNumber
是int
,基于您所描述的内容。发生的事情是整数截断。当您将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;