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.AvailableFreeSpace来int马上是行不通的,因为数字164660715520是您要投不适合在32位.你需要尽可能长时间保持64位.
避免浮点算术的技巧是首先乘以100,然后进行除法.
只要数字时间100在允许的大小范围内(在您的情况下,它是),结果具有良好的精度:
label10.Text = ((100*dInfo.AvailableFreeSpace/dInfo.TotalSize)).ToString();
Run Code Online (Sandbox Code Playgroud)
long total = 256058060800L;
long avail = 164660715520L;
var pct = (100*avail/total).ToString();
Console.WriteLine("{0}", pct); // 64
Run Code Online (Sandbox Code Playgroud)
该值向下舍入为 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)
| 归档时间: |
|
| 查看次数: |
11917 次 |
| 最近记录: |