为什么这个算术表达式不相等?

时间:2014-02-10 09:27:38

标签: c# visual-studio-2010 c#-4.0 math logic

在Visual Studio 2010中,c#.net在编程时发现表达式

 var prs1 = (e.X * 100) / panel4.Width;            
 var prs2 = prs1;
 var ans = (prs2 * panel2.Width) / 100;            
 pb2.Location = new Point(ans, 30);

和另一个代码:

var prs1 = (e.X / panel4.Width) * 100;
 var prs2 = prs1;
 var ans = (prs2 /100) * panel2.Width;
 pb2.Location = new Point(ans, 30);
 //this code giving incorrect response

请以数学方式告诉我们两个代码都等于编译器为什么不给我相同的输出?

3 个答案:

答案 0 :(得分:1)

e.X看起来像是事件处理程序的X坐标。这是一个整数值。 .Width属性也是如此。

首先划分值可能会导致精度损失,特别是如果整数除法导致0.之后乘以100仍然会得到0。

如果先乘以100,则除法更有可能为0。

答案 1 :(得分:0)

这里的问题是四舍五入。

第二个代码的第一部分(e.X / panel4.width)很可能会得到0作为结果:

让我们说:

e.X = 40,panel4.width = 250

然后你得到:

pr1 =(e.X / panel4.width); // 0.16然后它舍入到0 pr1 = pr1 * 100 //结果为0

您需要将您的值转换为double以获得double的结果,然后您可以稍后自己转换为“int”。

pr1 = Convert.ToDouble(e.X)/ Convert.ToDouble(panel1.Width)* 100; //结果是16.0

答案 2 :(得分:-1)

你的问题与airthmetic表达无关。它只是因为var keyword.var被用作泛型类型。如果你初始化val像as int那么你不能在其中插入任何字符串值或者可能是其他东西。 你有var ans喜欢double或int你把它传递给[pb2.Location = new Point(ans,30);]这是错误的。因为point与另一种类型相关。