【问题标题】:Error in calculation Winforms C#Winforms C#中的计算错误
【发布时间】:2017-11-17 15:02:22
【问题描述】:

我正在构建具有 3 个文本框的 C# WinForms 应用程序。前两个取值,计算后在第三个文本框中显示值。它必须在文本框中,以便用户在认为计算错误时可以更改值。一切正常,但是当我在 Windows 7 上运行应用程序时出现巨大错误,它计算出(例如)2 乘以 2.15 是 430。为什么会这样?我尝试在那台计算机上安装最新的 .Net 框架,但仍然无法正常工作,经过研究,我没有进一步的想法。

num1 = num2 = sum = 0;
if (tbNum1.Text.Contains(","))
{
    tbNum1.Text = tbNum1.Text.Replace(",", ".");
}

double.TryParse(tbNum1.Text, out num1);
if (tbNum2.Text.Contains(","))
{
    tbNum2.Text = tbNum2.Text.Replace(",", ".");
}

double.TryParse(tbNum2.Text, out num2);
sum = num1 * num2;
sum = Math.Round(sum, 2);
tbSum.Text = sum.ToString();

此外,显示 WinForm 时还会出现另外两个问题。 首先是面板的大小和位置与我以编程方式设置的不同。 其次是(我想这是我的错,因为我可能做错了)所有面板都显示得很慢。我所拥有的就像 6 个具有特定尺寸和 6 个按钮的面板。根据按下的按钮,我将所有可见的面板设置为假,只有正确的面板可见为真。但它加载非常缓慢。你有什么建议吗 ?提前非常感谢!

【问题讨论】:

  • 我无法重现您的问题,可能是因为您发布的代码中没有显示导致问题的原因。在调试器中跟踪代码的每一行,将帮助您将问题代码归零。您应该注意到2 * 2.15 = 4.3 是您获得的答案的1/100th(需要考虑)
  • 数字格式一般遵循windows默认的,所以不要用Replace,用你的TryParse它会修复数字1
  • @Vikhram 没有使用英文数字格式,如果是的话,它会将逗号替换为空
  • 您确定在 Windows 7 机器上正确设置了文化吗?我听起来好像无法识别文本框中的小数点分隔符。究竟是什么,你进入那里?您输入的是22.15 还是22,15(注意最后一个条目中的逗号)。
  • 检查您的操作系统文化,以及您在文本框中输入的内容

标签: c# .net winforms double


【解决方案1】:

您对双精度的解析是错误的。你可以这样做:

        double num1, num2, product = 0;

        if (tb1.Text.IndexOf(",") != -1)
        {
            tb1.Text = tb1.Text.Replace(",", ".");
        }
        num1 = double.Parse(tb1.Text, System.Globalization.CultureInfo.InvariantCulture);

        if(tb2.Text.IndexOf(",") != -1)
        {
            tb2.Text = tb2.Text.Replace(",", ".");
        }
        num2 = double.Parse(tb2.Text, System.Globalization.CultureInfo.InvariantCulture);

        product = Math.Round(num1 * num2,2);

        tb3.Text = product.ToString();

【讨论】:

  • 感谢您的回答。我试过了,但现在在 2,15 和 2 我得到 4.62。
  • 奇怪,我得到的正确结果是 4,3
  • 好吧,那是我的错,因为 2.15 乘以 2.15 就是 4.62。 num2 = double.Parse(tb1.Text, System.Globalization.CultureInfo.InvariantCulture);去检查
  • 非常感谢,这是文化问题和我的复制粘贴问题。现在我在有问题的电脑上试了一下,效果很好!你是天才:)
  • 很高兴听到它现在正在工作!对于小组问题,需要更多关于这样做的目的的信息。一种解决方案是使用 WPF ;) WinForms 真的过时了,不再受支持
【解决方案2】:

double.Parse 识别为小数分隔符的字符取决于提供的IFormatProvider;如果您不提供任何内容,那就是当前文化的内容。

如果您特别想使用点作为小数分隔符,您可以使用CultureInfo.InvariantCulture

double.TryParse(tbNum2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out double num);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多