int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
该短语的结果是意外的,我得到零。
为什么它不起作用?
答案 0 :(得分:6)
您正在(countBouncy / count)
进行整数除法。将您的代码更改为
double percent = ((double)countBouncy / count) * 100.0;
这样,countBouncy
显式转换为double
,count
被c#编译器隐式转换为double
,使其与(double
兼容} {} countBouncy
。
否则(countBouncy / count)
计算为(5 / 999899) --> 0
,因为两者都是整数。
整数除法如何工作?我们来举个例子:
7 / 2 = 3
整数除法会丢弃实际除法产生的小数部分。结果被截断为零。您可以使用模运算符
来获得该除法的剩余部分7 % 2 = 1
并执行这样的反向计算
2 * (7 / 2) + 7 % 2 = 7
您可以在Visual Studio的即时窗口中输入它来测试它:
?2 *(7/2)+ 7%2< enter>
7
答案 1 :(得分:2)
因为你的除法是整数除法,导致0,你然后强制转换成双精度。
您当前的代码实际上与以下代码相同:
int temp = countBouncy / count; // == 0
double percent = (double)temp * 100.0;
你首先投射其中一个项目:
double percent = ((double)countBouncy / count) * 100.0;
这将使你的分工预先以双精度完成。
答案 2 :(得分:2)
当您将int
除以int
时,结果始终为int
,因此它将向下舍入到最接近的整数(零)。试试这个:
((double)countBouncy / count) * 100.0;
答案 3 :(得分:2)
你的分子和分母都是int
s。因此,得到的商是int
,C#通过向下舍入为0来计算。另外,您尝试将double
类型分配给int
类型。为了达到理想的效果,请执行以下操作:
double percent = ((double) countBouncy / count) * 100.0;