[英]C++ Weird Variable Issues
我正在使用以下代码来计算和显示C ++中数学游戏的最终分数。
int score = (correctNumber / 3) * 100;
cout << score;
变量“ correctNumber”始终为0到3之间的值。但是,除非“ correctNumber” = 3,否则变量“ score”始终等于“ 0”。 当“ correctNumber”等于3时,“得分”等于100。
假设“ correctNumber”等于2。那么“分数”不应该是67吗? 这是int变量类型无法计算小数点的问题吗?
您正在做整数运算,所以1/3为0。
尝试:
int score = (100 * correctNumber) / 3
如果要四舍五入:
int score = (100 * correctNumber + 1) / 3
根据您的描述,我假设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。
你的猜测是正确的。 int
无法存储实数。
但是,您可以先相乘然后相除
score = correctNumber * 100 / 3;
分数将为correctNumber
,具体取决于correctNumber
值
问题是(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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.