c#的双数据类型总是给出一个0

本文关键字:一个 数据类型 | 更新日期: 2023-09-27 18:03:08

我有以下函数,通常需要返回一个值。我在计算器应用程序中计算值,得到的值很好。但是在下面的程序中value变量value总是0。我试过使用长,双,浮动,但没有任何作用。请帮助。

 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#的双数据类型总是给出一个0

因为nrdr都是long,所以(nr / dr)的结果是long,因为dr大于nr,所以结果等于0

为了解决这个问题,您可以在计算期间将其转换为double:

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

或者您可以将nrdr定义为double s:

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

原始代码示例中的行为称为整数除法。请参阅c#规范中的除法运算符文章或为什么c#中的整数除法返回整数而不是浮点数?更多信息

nrdr是整数,这意味着nr/dr是整数除法,由于dr总是比nr大,所以得到0。

在分割前将它们转换为double:

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

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

要执行浮点除法。您可以通过将nrdr转换为double来实现这一点。或者,在您的情况下,您可以将乘法稍微向上移动100.0(乘以100.0,强制将nr强制转换为double,这意味着dr也将在除法时自动转换为double):

double value = nr * 100.0 / dr;

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;
    }

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

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);
}
相关文章: