int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
那句话的结果是出乎意料的,我得了零。
为什么它不起作用?
int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
那句话的结果是出乎意料的,我得了零。
为什么它不起作用?
您正在对 进行整数除法(countBouncy / count)
。将您的代码更改为
double percent = ((double)countBouncy / count) * 100.0;
这样, c# 编译器将显式countBouncy
转换为double
显式count
转换为double
隐式转换,以使其与 (now 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<输入>
7
因为您的除法是整数除法,结果为 0,然后您将其转换为双精度数。
您当前的代码实际上与以下代码相同:
int temp = countBouncy / count; // == 0
double percent = (double)temp * 100.0;
您是否先投射其中一项:
double percent = ((double)countBouncy / count) * 100.0;
这将导致您的除法预先以双精度完成。
当您将 anint
除以 anint
时,结果始终为 an int
,因此它将向下舍入到最接近的整数(零)。试试这个:
((double)countBouncy / count) * 100.0;
你的分子和分母都是int
s。因此,得到的商是int
C# 通过向下舍入到 0 来计算的。另外,您正在尝试将类型分配给double
类型int
。为了达到您想要的结果,请执行以下操作:
double percent = ((double) countBouncy / count) * 100.0;