浮点数乘法会返回意外结果

时间:2012-10-13 00:02:21

标签: c# floating-point double

int countBouncy=5;
int count=999899;

double percent = (double)(countBouncy / count) * 100.0;

该短语的结果是意外的,我得到零。

为什么它不起作用?

4 个答案:

答案 0 :(得分:6)

您正在(countBouncy / count)进行整数除法。将您的代码更改为

double percent = ((double)countBouncy / count) * 100.0;

这样,countBouncy显式转换为doublecount被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;