C#数学问题

时间:2008-12-11 21:03:45

标签: c# math

我在这一天的大部分时间里一直在研究这个问题,我似乎无法使这部分代码工作。代码的目的是允许用户输入一组值以计算缺失值。作为附加功能,我在表单上放置了一个CheckBox,以允许用户进行进一步的计算。这就是我的问题所在。我知道代码有效,因为如果我更改公式,tb3_aic.Text中显示的值会根据公式进行更改。但是,当我使用下面的答案时,答案并没有像它应该的那样改变。请参考附带的代码。如果公式需要jpg图像,我可以通过电子邮件发送。

 void Calc3Click(object sender, EventArgs e)

    {
       if (String.IsNullOrEmpty(tb3_skv.Text) | String.IsNullOrEmpty(tb3_kva.Text) | String.IsNullOrEmpty(tb3_z.Text))
    {
        MessageBox.Show("Enter all required values", "Missing Data", MessageBoxButtons.OK);
    }   //If user does not enter all the values required for the calculation show error message box
    else

    {
        if (!String.IsNullOrEmpty(tb3_skv.Text) & !String.IsNullOrEmpty(tb3_kva.Text) & !String.IsNullOrEmpty(tb3_z.Text))

        { //If motor load check box is not checked and required values are entered calculate AIC based on formula.
            int y; 
            decimal x, z, a;
            x = decimal.Parse(tb3_skv.Text);      
            y = int.Parse(tb3_kva.Text);
            a = decimal.Parse(tb3_z.Text);
            z = (y * 1000) / (x * 1.732050808m) / (a / 100); //the m at the end of the decimal allows for the multiplication of decimals
            tb3_aic.Text = z.ToString();
            tb3_aic.Text = Math.Round(z,0).ToString();
        }


        if (cb3_ml.Checked==true) 
        {//If Motor Load CB is checked calculate the following
            int y, b;
            decimal x, z, a;
            x = decimal.Parse(tb3_skv.Text);
            y = int.Parse(tb3_kva.Text);
            a = decimal.Parse(tb3_z.Text);
            b = int.Parse(tb3_ml.Text);
            z = ((y * 1000) / (x * 1.732050808m) / (a / 100))+((b / 100)*(6*y)/(x*1.732050808m)*1000);
            tb3_aic.Text = z.ToString();
            tb3_aic.Text = Math.Round(z,5).ToString();
        }

     }

我很感激可以提供任何帮助。

谢谢你, Greg Rutledge

5 个答案:

答案 0 :(得分:5)

如果不知道问题是什么,有些事情看起来有点奇怪:

  • 此外,在计算中混合使用decimal和int可能会导致意外结果,除非您确实知道自己在做什么。我建议只使用小数(或双精度,这样更快,通常具有足够的精度用于工程计算)。
  • 您还设置了两次tb3_aic.Text,我假设您决定稍后进行舍入而忘记删除第一个。

编辑:这在C#中显然是错误的:

  • 你在if子句中使用逐位AND(&),你可能意味着逻辑AND(&&)。

与布尔操作数一起使用时,它们之间的唯一区别是&&短路(如果左边是假,则不评估右操作数)。我学到了一些东西,谢谢大家评论。 :)

答案 1 :(得分:3)

改变这个:

int y, b;

对此:

int y;
decimal b;

根据这个测试,它有效:

    public void Test2()
    {
        int y;
        decimal b;
        decimal x, z, a;
        decimal z1, z2;
        x = 480m;
        y = 2500;
        a = 5.75m;
        b = 10;
        z1 = ((y * 1000) / (x * 1.732050808m) / (a / 100));
        z2 = ((b / 100) * (6 * y) / (x * 1.732050808m) * 1000);
        z = z1 + z2;
        Console.WriteLine("{0}, {1}", z1, z2);
        Console.WriteLine(Math.Round(z, 0).ToString());
    }

原因是整数10除以整数100是整数0,零是整个z2。

答案 2 :(得分:0)

样本输入,第一个公式 x = 480 y = 2500 a = 5.75

对于第一个公式,输出应为52296

样本输入,第二个公式 x = 480 y = 2500 a = 5.75 b = 10

对于第一个公式,输出应为54100.42

希望这有帮助

答案 3 :(得分:0)

这行不是必需的,虽然它不是一个bug,但它总是评估为真

if (!String.IsNullOrEmpty(tb3_skv.Text) & !String.IsNullOrEmpty(tb3_kva.Text) & !String.IsNullOrEmpty(tb3_z.Text)) {

答案 4 :(得分:0)

我不知道这是不是很大,但是当你尝试连接时,你要设置两次tb3_aic文本框的文本?

tb3_aic.Text = z.ToString();
tb3_aic.Text = Math.Round(z,0).ToString();

您似乎在两种方法中都这样做。

我看的越多,这可能是一个问题,因为你在第一个设置它然后第二个If如果复选框被选中将覆盖它。

豫ICP备18024241号-1