繁体   English   中英

在C#中除以2个long时获得0值

[英]Getting a value of 0 when dividing 2 longs in c#

我正在尝试将DriveInfo.AvailableFreeSpace和DriveInfo.TotalSize的值相除,以尝试获取进度条中要使用的百分比。

我需要最终值是一个整数,因为progressbar.value需要一个整数,并且上述方法返回long。

我将其作为值:

164660715520 ---可用的自由空间

256058060800 ---总大小

当我尝试使用此方法设置progressbar.value时,也会出现错误:

progressBar1.Value =(int)(dInfo.AvailableFreeSpace / dInfo.TotalSize)* 100;

当我使用此代码尝试获取值时,它只会返回0。

label10.Text =  (((int)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();

我什至尝试过,但不起作用:

label10.Text = ((dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();

我知道我仍然需要进行一些格式化才能使其看起来不错,但是每当我运行代码时,它只会返回0。

它与long到int的转换有关吗?

整数除法仅返回整数部分。 因此3/5将为0。您需要将至少一个因子视为浮点数。 尝试这个:

label10.Text =  (((int)((double)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100)).ToString();

立即将dInfo.AvailableFreeSpaceint的第一种方法将不起作用,因为您尝试转换的数字164660715520不适合32位。 您需要保持尽可能长的64位。

避免浮点运算的技巧是先乘以100 ,然后进行除法。

只要数字乘以100都在允许的大小范围内(对于您而言,是这样),结果就具有良好的精度:

label10.Text = ((100*dInfo.AvailableFreeSpace/dInfo.TotalSize)).ToString();

关于ideone的演示(打印64)。

long total = 256058060800L;
long avail = 164660715520L;
var pct = (100*avail/total).ToString();
Console.WriteLine("{0}", pct); // 64

该值四舍五入为0,因为long类型不能有小数位,只能是整数。

在乘以100前转换为decimal类型

例如(在我要为ProgressBar计算进度百分比的情况下):

double someVariable =(double)longVariable1 /(double)longVariable2;

代码如下:

public partial class Form1 : Form
{
   public Form1()
    {
         web.ProgressChanged += new WebBrowserProgressChangedEventHandler(web_ProgressChanged);
    }

private void web_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
    {

        <strong>double t = (100 * (double)e.CurrentProgress / (double)e.MaximumProgress);</strong>
        if (t < 0)
            return;
        int c = (int)t;
        progressBar.Value = c;

        if (c == 100)
        {
            label1.Text = "Done";                
        }
    }
}

使您的dInfo.AvailableFreeSpace和dInfo.TotalSize为小数或双精度类型,以避免强制转换或

使用label10.Text = (((double)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();

我可能有点晚了,但是在尝试比较时间跨度时遇到了这个问题。 最终,我将每个timepsan转换为字符串并手动计算比例

    private static double Improvement(string efficientTime, string inefficientTime)
    {
        var magnitude = Math.Pow(10, (inefficientTime.Length - efficientTime.Length));
        var time2 = (double) Convert.ToInt32(efficientTime.Substring(0, 5));
        var time1 = (double) Convert.ToInt32(inefficientTime.Substring(0, 5));
        var sigRatio = (time2 / time1);

        var sigPercent = sigRatio * magnitude;

        var improvement = sigPercent;
        return improvement;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM