C# 浮点数乘法返回意外结果

C# 浮点数乘法返回意外结果,c#,floating-point,double,C#,Floating Point,Double,这个短语的结果出乎意料,我得到零 为什么不工作?您正在对(countBouncy/count)进行整数除法。将代码更改为 int countBouncy=5; int count=999899; double percent = (double)(countBouncy / count) * 100.0; 这样,countBouncy被c编译器显式转换为double,而count被隐式转换为double,使其与(现在的double)兼容 否则(countBouncy/count)计算为(5/

这个短语的结果出乎意料,我得到零


为什么不工作?

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

int countBouncy=5;
int count=999899;

double percent = (double)(countBouncy / count) * 100.0;
这样,
countBouncy
被c编译器显式转换为
double
,而
count
被隐式转换为
double
,使其与(现在的
double
)兼容

否则
(countBouncy/count)
计算为
(5/999899)-->0,因为两者都是整数


整数除法是如何工作的?让我们举一个例子:

double percent = ((double)countBouncy / count) * 100.0;
整数除法删除实数除法产生的小数部分。结果被截断为零。您可以使用模运算符得到此除法的余数

7 / 2 = 3
然后像这样进行反向计算

7 % 2 = 1
您可以在Visual Studio的即时窗口中输入以下内容以进行测试:

?2*(7/2)+7%2
七,


因为您的除法是整数除法,结果是0,然后将其转换为双精度

您当前的代码实际上与以下代码相同:

2 * (7 / 2) + 7 % 2 = 7
您是否先在其中一个项目上施展:

int temp = countBouncy / count;  // == 0
double percent = (double)temp * 100.0;

这将导致前面的除法是双精度的。

当您将
int
除以
int
时,结果总是
int
,因此它将向下舍入到最接近的整数(零)。请尝试以下方法:

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

你的分子和分母都是
int
s。因此,得到的商是一个
int
,C#通过四舍五入到0来计算。另外,您正在尝试将
double
类型分配给
int
类型。为了达到预期效果,请执行以下操作:

((double)countBouncy / count) * 100.0;

真的很好用。但是,您的期望是错误的。您确定您的意思是
int%吗?我的意思是
双倍的百分比。可能我复制粘贴了一个早期的错误版本。谢谢你的评论。
double percent = ((double) countBouncy / count) * 100.0;