C#Bug或者说错了

时间:2014-11-30 18:19:15

标签: c# vb.net percentage division

我有一个问题,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。

4 个答案:

答案 0 :(得分:3)

130 / 20执行integer divison

来自/ Operator (C# Reference)

  

分割两个整数时,结果始终为整数。对于   例如,7/3的结果是2

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

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

例如;

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

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

答案 1 :(得分:1)

您需要将值转换为double:

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

130 / 20 = 6.5,它会被隐含地转换为integer,这会使6成为{{1}}。因此,错误的值用于以下乘法

答案 2 :(得分:1)

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

通过将变量定义为double s:

,您可以完全避免此问题
double width = 130;
double maxValue = 20;
double value = 20;

double percent = (width / maxValue) * value;

答案 3 :(得分:0)

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

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

int width = 130;
float maxValue = 20.0;
int value = 20;

int percent = (width / maxValue) * value