【问题标题】:C# double datatype gives a 0 alwaysC# double 数据类型总是给出 0
【发布时间】:2016-08-19 23:53:32
【问题描述】:

我有以下通常需要返回值的函数。我在计算器应用程序中计算值,我得到的值很好。但在下面的程序中,值变量值始终为 0。我尝试过使用 long、double、float 但没有任何效果。请帮忙。

 public string CalculateElapsedPercent(DateTime endTime, DateTime startTime)
        {
            string result = string.Empty;
            DateTime currentTime = DateTime.Now;
            if (currentTime > endTime)
            {
                result = " (100 %)";
                return result;
            }
            long nr = (currentTime - startTime).Ticks;
            long dr = (endTime - startTime).Ticks;
            double value = (nr / dr) * 100.0;
            result = " (" + value.ToString() + " %)";
            return result;
        }

【问题讨论】:

    标签: c# operator-precedence


    【解决方案1】:

    由于nrdr 都是long,所以(nr / dr) 的结果是long,并且由于dr 大于nr,所以结果等于0

    为了解决这个问题,您可以在计算过程中将其转换为double

    double value = ((double)nr / (double)dr) * 100.0;
    

    或者您可以将nrdr 定义为doubles:

    double nr = (currentTime - startTime).Ticks;
    double dr = (endTime - startTime).Ticks;
    double value = (nr / dr) * 100.0;
    

    原始代码示例中的行为称为整数除法。有关更多信息,请参阅 Division operator article in C# SpecificationWhy integer division in c# returns an integer but not a float? stackoverflow 问题

    【讨论】:

    • 那么 nr 应该是 long 并且 dr 应该是 double 还是其他类型?
    • 你可以通过几个演员来修复它,((double)nr / (double)dr)
    • 其实只转换一个就够了,编译器会自动使用精度最高的类型进行运算。
    【解决方案2】:

    nrdr 是整数,这意味着nr/dr 是整数除法,并且由于dr 将始终大于nr,因此您将得到零。

    在划分之前将它们转换为double

    double nr = Convert.ToDouble((currentTime - startTime).Ticks);
    double dr = Convert.ToDouble((endTime - startTime).Ticks);
    double value = (nr / dr) * 100.0;
    

    【讨论】:

      【解决方案3】:

      您正在执行整数除法 (nr / dr),这意味着您丢失了所有十进制值。

      您希望执行浮点除法。您可以通过将nrdr 转换为double 来做到这一点。或者,在您的情况下,您可以将乘法上移@98​​7654325@ 一点(乘以100.0,强制将nr 强制转换为double,这意味着dr 也将自动投射到double 用于部门):

      double value = nr * 100.0 / dr;
      

      【讨论】:

      • 这就是我要做的,它不那么冗长而且同样有效。
      【解决方案4】:

      nr 和 dr 都是 long 本质上是整数。如果您使用 (nr / dr) 并且 dr 大于 nr,则除法的结果将是零。只需将 nr 和 dr 加倍,您的问题就会得到解决。 :)

          public string CalculateElapsedPercent(DateTime endTime, DateTime startTime)
          {
              string result = string.Empty;
              DateTime currentTime = DateTime.Now;
              if (currentTime > endTime)
              {
                  result = " (100 %)";
                  return result;
              }
              long nr = (currentTime - startTime).Ticks;
              long dr = (endTime - startTime).Ticks;
              double value = ((double)nr / (double)dr) * 100.0;
              result = " (" + value.ToString() + " %)";
              return result;
          }
      

      【讨论】:

        【解决方案5】:

        其他人已经解释了这个问题,但我也想建议对你的方法进行一些改进。例如,像这样:

        public static string CalculateElapsedPercent(DateTime endTime, DateTime startTime)
        {
            double ratio;
            DateTime currentTime = DateTime.Now;
            if (currentTime > endTime)
            {
                ratio = 1;
            }
            else
            {
                var elapsed = currentTime - startTime;
                var total = endTime - startTime;
                ratio = elapsed.TotalMinutes / total.TotalMinutes;
            }
            return string.Format(" ({0:P2})", ratio);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-04-07
          • 1970-01-01
          • 2020-09-22
          • 1970-01-01
          • 2015-11-20
          • 2020-02-20
          • 1970-01-01
          • 2020-02-17
          • 2017-07-05
          相关资源
          最近更新 更多