C#double数据类型总是给出0

时间:2016-08-19 23:53:33

标签: c# operator-precedence

我有以下通常需要返回值的函数。我在计算器应用程序中计算值,我得到的值很好。但是在下面的程序中,值变量值始终为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;
        }

5 个答案:

答案 0 :(得分:1)

由于nrdr都是long(nr / dr)的结果是long,因为dr大于nr 1}},结果等于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;

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

答案 1 :(得分:1)

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;

答案 2 :(得分:1)

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

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

double value = nr * 100.0 / dr;

答案 3 :(得分:0)

nr和dr都是public class Test{ public static void setInt(int value){ System.out.println(value); } public static void main(String[] args) { Integer testValue=null; Test.setInt(testValue); } } ,它们基本上是整数。如果你使用(nr / dr)并且long大于dr,那么由于除法,你最终会得到零。刚刚施放nr和dr加倍,你的问题就会解决。 :)

nr

答案 4 :(得分:0)

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

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