在c#中划分2个long时获取值0

Zer*_*tas 8 c# int casting long-integer

我试图划分DriveInfo.AvailableFreeSpace和DriveInfo.TotalSize的值来尝试获取它在进度条中使用的百分比.

我需要结束值为int,因为progressbar.value需要一个int,上面的方法返回一个long.

我有这个值:

164660715520 --- AvailableFreeSpace

256058060800 ---总计TOTALSIZE

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

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

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

label10.Text =  (((int)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();
Run Code Online (Sandbox Code Playgroud)

我甚至试过这个,它不起作用:

label10.Text = ((dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();
Run Code Online (Sandbox Code Playgroud)

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

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

Tud*_*dor 19

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

label10.Text =  (((int)((double)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100)).ToString();
Run Code Online (Sandbox Code Playgroud)


das*_*ght 11

与铸造的第一种方式dInfo.AvailableFreeSpaceint马上是行不通的,因为数字164660715520是您要投不适合在32位.你需要尽可能长时间保持64位.

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

只要数字时间100在允许的大小范围内(在您的情况下,它是),结果具有良好的精度:

label10.Text = ((100*dInfo.AvailableFreeSpace/dInfo.TotalSize)).ToString();
Run Code Online (Sandbox Code Playgroud)

在ideone上演示(打印64).

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


Cur*_*urt 5

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

decimal乘以 100 之前强制转换为类型

例如(在我的例子中,我正在计算 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";                
        }
    }
}
Run Code Online (Sandbox Code Playgroud)