【发布时间】:2012-10-13 00:02:21
【问题描述】:
int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
那句话的结果出乎意料,我得了零。
为什么它不起作用?
【问题讨论】:
-
它工作正常,真的。然而你的期望是错误的。
标签: c# floating-point double
int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
那句话的结果出乎意料,我得了零。
为什么它不起作用?
【问题讨论】:
标签: c# floating-point double
您正在对(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
7
【讨论】:
int percent?
double percent。可能我复制粘贴了一个早期的错误版本。感谢您的评论。
因为您的除法是整数除法,结果为 0,您然后将其转换为双精度数。
您当前的代码实际上与以下代码相同:
int temp = countBouncy / count; // == 0
double percent = (double)temp * 100.0;
您是否先对其中一个项目施放:
double percent = ((double)countBouncy / count) * 100.0;
这将导致您的除法预先以双精度完成。
【讨论】:
当您将int 除以int 时,结果始终是int,因此它会向下舍入到最接近的整数(零)。试试这个:
((double)countBouncy / count) * 100.0;
【讨论】:
你的分子和分母都是ints。因此,得到的商是 int,C# 通过向下舍入到 0 来计算。另外,您正在尝试将 double 类型分配给 int 类型。为了达到您想要的结果,请执行以下操作:
double percent = ((double) countBouncy / count) * 100.0;
【讨论】: