C# double 数据类型总是给出 0
C# double datatype gives a 0 always
我有以下函数,通常需要 return 一个值。我在计算器应用程序中计算值,并且得到的值很好。但在下面的程序中,值变量值始终为 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;
}
因为nr
和dr
都是long
,所以(nr / dr)
的结果是long
,而且dr
大于nr
,结果等于0
.
为了解决这个问题,您可以在计算时将其转换为 double
:
double value = ((double)nr / (double)dr) * 100.0;
或者您可以将 nr
和 dr
定义为 double
s:
double nr = (currentTime - startTime).Ticks;
double dr = (endTime - startTime).Ticks;
double value = (nr / dr) * 100.0;
原始代码示例中的行为称为整数除法。有关详细信息,请参阅 Division operator article in C# Specification or Why integer division in c# returns an integer but not a float? Whosebug 问题
nr
和 dr
是整数,这意味着 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;
您正在执行整数除法 (nr / dr
),这意味着您将丢失所有小数值。
您反而想执行浮点除法。您可以通过将 nr
或 dr
转换为 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);
}
我有以下函数,通常需要 return 一个值。我在计算器应用程序中计算值,并且得到的值很好。但在下面的程序中,值变量值始终为 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;
}
因为nr
和dr
都是long
,所以(nr / dr)
的结果是long
,而且dr
大于nr
,结果等于0
.
为了解决这个问题,您可以在计算时将其转换为 double
:
double value = ((double)nr / (double)dr) * 100.0;
或者您可以将 nr
和 dr
定义为 double
s:
double nr = (currentTime - startTime).Ticks;
double dr = (endTime - startTime).Ticks;
double value = (nr / dr) * 100.0;
原始代码示例中的行为称为整数除法。有关详细信息,请参阅 Division operator article in C# Specification or Why integer division in c# returns an integer but not a float? Whosebug 问题
nr
和 dr
是整数,这意味着 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;
您正在执行整数除法 (nr / dr
),这意味着您将丢失所有小数值。
您反而想执行浮点除法。您可以通过将 nr
或 dr
转换为 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);
}