1

2 つの DateTime 間のパーセンテージを計算する方法を知りたいのですが、提供された DateTime に達するまで実行する BackgroundWorker があり、その部分は正常に動作しています。UI にワーカーの完了パーセンテージを表示したいだけです。

私は次のアプローチを使用しようとしました:

var now = DateTime.Now;
var executeUntil = DateTime.Now..AddHours(4).AddMinutes(10);

var percentage = (int)(( executeUntil.Ticks * 100 ) / now.Ticks ); 

しかし、常に 1 を返します。これは、Ticks が長い数値であり、何らかの理由で除算が切り捨てられているためだと思います。

助言がありますか?

4

2 に答える 2

5

これを試して:

var start = DateTime.Now;
var end = DateTime.Now.AddMinutes(1);
var total = (end - start).TotalSeconds;

for( int i = 0; i < 10; i++)
{
Thread.Sleep(6000);

var percentage = (DateTime.Now - start).TotalSeconds*100/total;
Console.WriteLine(percentage);
}
于 2012-10-29T03:47:15.290 に答える
3

あなたは切り捨てについて正しいです。現在、longで除算しているので、商はMath.Floorそれに適用され、小数をサポートしないlongにもなります。与えた正確なコードを修正するには、除数または被除数のいずれかを浮動小数点数にする必要があります。これにより、分子はすぐに2倍になります。

var percentage = (int)(( executeUntil.Ticks * 100d ) / now.Ticks ); 
于 2012-10-29T03:58:27.353 に答える