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