【问题标题】:Divide by zero error, how do I fix this?除以零错误,我该如何解决?
【发布时间】:2008-10-01 22:55:02
【问题描述】:

这里的 C# 新手,当下面的 int 'max' 为 0 时,我得到除以零的错误,我知道为什么会发生这种情况,但是当 max 为 0 时我应该如何处理呢? position 也是一个 int。

    private void SetProgressBar(string text, int position, int max)
    {
        try
        {
            int percent = (100 * position) / max; //when max is 0 bug hits
            string txt = text + String.Format(". {0}%", percent);
            SetStatus(txt);
        }
        catch
        {
        }
    }

【问题讨论】:

标签: c# divide-by-zero


【解决方案1】:
int percent = 0
if (max != 0) percent = (100*position) / max

【讨论】:

    【解决方案2】:

    嗯,这完全取决于你想要的行为。如果您的程序栏的最大值为零,是否已满?是空的吗?这是一个设计选择,当您选择后,只需测试 max == 0 并部署您的答案。

    【讨论】:

      【解决方案3】:
      • 您可以抛出异常。
      • 你可以做int percent = ( max > 0 ) ? (100 * position) / max : 0;
      • 您可以选择什么都不做,而不是为百分比赋值。
      • 很多很多其他的东西......

      取决于你想要什么。

      【讨论】:

        【解决方案4】:

        检查为零。

        if ( max == 0 ) {
            txt = "0%";
        } else {
            // Do the other stuff....
        

        【讨论】:

          【解决方案5】:

          这不是 C# 问题,而是数学问题。除以零是未定义的。有一个 if 语句来检查 max > 0 并且只执行你的除法。

          【讨论】:

            【解决方案6】:

            转换你的

            int percent = (100 * position) / max;
            

            进入

            int percent;
            if (max != 0)
                percent = (100 * position) / max;
            else
                percent = 100; // or whatever fits your needs
            

            【讨论】:

              【解决方案7】:

              好吧,如果最大值为零,则没有进展。尝试捕获调用 this 的异常。这可能是决定是否存在问题或进度条应设置为零还是 100% 的地方。

              【讨论】:

              • 我不同意这里。允许抛出异常会带来性能损失——如果计算发生在一个大的循环序列中怎么办?如果我们可以预见到问题,那么我们应该在抛出异常之前对其做出反应,并将异常处理留给未知场景。
              • @PatrickMcCurley 这不是对通用算术异常处理的评论 - 这是对实际问题的回答。
              【解决方案8】:

              我想根本问题是:在 max 为 '0' 的情况下调用这个函数是否有意义?如果是,那么我会为其添加特殊处理,即:

              if (max == 0) 
              {
                  //do special handling here
              }
              else
              {
                  //do normal code here
              }
              

              如果 0 没有意义,我会调查它的来源。

              【讨论】:

                【解决方案9】:

                你需要一个保护子句来检查 max == 0。

                private void SetProgressBar(string text, int position, int max)
                {
                    if(max == 0)
                        return;
                    int percent = (100 * position) / max; //when max is 0 bug hits
                    string txt = text + String.Format(". {0}%", percent);
                    SetStatus(txt);
                }
                

                您也可以处理除以零异常,如您的示例所示,但处理异常通常比设置检查已知错误值的成本更高。

                【讨论】:

                  【解决方案10】:

                  如果您使用它进行下载,您可能希望显示 0%,因为我假设 max == 0 在这种情况下您还不知道文件大小。

                  int percent = 0;
                  if (max != 0)
                      ...;
                  

                  如果您将其用于其他长期任务,我想假设 100%

                  而且,由于 position 永远不会介于 0 和 -1 之间,所以您可能希望删除 100 *

                  【讨论】:

                    【解决方案11】:

                    您可以使用三元运算符。

                    int percent = max != 0 ? (100 * position) / max : 0;
                    

                    这意味着当max不等于0时,要执行计算。如果它等于 0,那么它会将百分比设置为 0。

                    【讨论】:

                      猜你喜欢
                      • 2022-01-22
                      • 1970-01-01
                      • 2021-10-02
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-07-21
                      • 2018-11-10
                      • 2016-09-09
                      相关资源
                      最近更新 更多