C#Bug或者说错了

我有一个问题,C#没有正确计算我绘制我的进度条。

int width = 130; int maxValue = 20; int value = 20; int percent = (width / maxValue) * value 

现在它应该返回130,这意味着我的进度条已满,但它返回120,所以我不知道发生了什么。

这里是进度条的图像http://imgur.com/sUbshxk

我还用VB.NET测试了这个公式,它运行得很好。

我在Windows 7 x86中使用VS2013。

130/20执行整数除法

来自/运营商(C#参考)

除以两个整数后,结果始终为整数。 例如,7/3的结果是2

这就是为什么它总是丢弃小数部分而它返回6 。 这就是为什么你的结果是6 * 20 ,等于120

作为解决方案,您可以将整数除法更改为浮点除法

例如;

 var percent = (130.0 / 20) * 20; var percent = (130 / 20.0) * 20; 

这意味着,您需要将一个变量定义为double ,或者在计算中将其中一个变为double

您需要将值转换为double:

 int percent = (int)(((double)width / (double)maxValue) * (double)value); 

130 / 20 = 6.5并且它将被隐含地转换为integer ,其产生6 。 因此,错误的值用于以下乘法

由于您要划分两个int变量,因此您将执行整数除法。 130/20是6.5,在整数上下文中被截断为6.然后乘以20,以生成120的结果。

您可以通过将变量定义为double完全避免此问题:

 double width = 130; double maxValue = 20; double value = 20; double percent = (width / maxValue) * value; 

在大多数编程语言中,将整数除以整数始终会产生整数。

如果您不想要整数结果,请确保至少有一个操作数是float或double:

 int width = 130; float maxValue = 20.0; int value = 20; int percent = (width / maxValue) * value