在c#中划分2个long时获取值0
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c#中划分2个long时获取值0相关的知识,希望对你有一定的参考价值。
我试图划分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();
我甚至试过这个,它不起作用:
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.AvailableFreeSpace
立刻投射到int
的第一种方法是行不通的,因为你试图施放的数字164660715520
不适合32位。你需要尽可能长时间保持64位。
避免浮点算术的技巧是首先乘以100
,然后进行除法。
只要100
的数量在允许的大小范围内(在您的情况下,它是),结果具有良好的精度:
label10.Text = ((100*dInfo.AvailableFreeSpace/dInfo.TotalSize)).ToString();
long total = 256058060800L;
long avail = 164660715520L;
var pct = (100*avail/total).ToString();
Console.WriteLine("{0}", pct); // 64
使你的dInfo.AvailableFreeSpace和dInfo.TotalSize小数或双精度类型以避免强制转换或
uselabel10.Text = (((double)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();
该值向下舍入为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";
}
}
}
我可能有点晚了,但在尝试比较时间跨度时我遇到了这个问题。最后我将每个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;
}
以上是关于在c#中划分2个long时获取值0的主要内容,如果未能解决你的问题,请参考以下文章
c语言中long型的65530转化为int型是多少啊?为啥啊?
在 C 中给出 unsigned long long 变量值的警告