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;