【问题标题】:Why this arithmetic expression is not equal?为什么这个算术表达式不相等?
【发布时间】:2014-02-10 09:27:37
【问题描述】:

在 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

请告诉我两个代码在数学上是相等的,而不是为什么编译器没有给我相同的输出?

【问题讨论】:

  • 你在用整数潜水,我很确定这就是问题的根源。你能把问题提取到一个特定的行吗?

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


【解决方案1】:

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

先除值可能会导致精度损失,尤其是整数除法结果为 0 时。再乘以 100 仍为 0。

如果先乘以 100,则除法不等于 0 的可能性更大。

【讨论】:

    【解决方案2】:

    这里的问题是四舍五入。

    第二个代码的第一部分(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

    【讨论】:

      【解决方案3】:

      您的问题与空气动力学表达式无关。只是因为 var 关键字.var 被用作泛型类型。如果你像 int 一样初始化 val,那么你不能在其中插入任何字符串值,或者可能是其他东西。 你得到了像 double 或 int 这样的 var ans,你把它传递给 [pb2.Location = new Point(ans, 30);] 这是错误的。因为点与另一种类型有关。

      【讨论】:

      • 老实说,我不知道你在这里想说什么。问题很可能是整数除法,而不是var
      • var 可以在泛型中使用。我不是说 var 是泛型。
      • 问题与分配的变量类型有关
      • 嗯,不。如果您将所有 3 个 vars 显式替换为 int(在这种情况下编译器会为您隐式执行),问题仍然存在。
      • 你确实说过“var 被用作泛型类型。”这是一个非常可疑的说法。 var(自动编译器推断的数据类型)和泛型是该语言的两个不同且不重叠的部分。
      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2018-10-14
      相关资源
      最近更新 更多