繁体   English   中英

C ++怪异变量问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM