2016-10-13 4 views
0

C#のdatetimeオブジェクトを最も近い分に丸めたい。したがって、datetimeオブジェクトに1分、29秒、999ミリ秒がある場合は、1分に丸めます。 1分30秒0ミリ秒の場合は、2分に丸めます。C#での日時の丸め - なぜこのソリューションは機能しますか?

var timespan = new TimeSpan(0, 0, 1, 0); 
//timespan has a value of 1 minute because I want to round to the nearest minute 
return new DateTime(((dateTime.Ticks + timespan.Ticks/2)/ timespan.Ticks)* timespan.Ticks); 

私は最後の行についてはよく分からない:

は、私は、インターネットから見つかったこのソリューションを実装しました。なぜ2で割りますか?なぜ私たちはタイムスパンで分裂するのですか?

+1

整数部は小数部分を切り捨てます。 –

+0

@TimSchmelter私はそう思っていましたが、この場合、1ダニは100ナノ秒であるため、その必要がありますか? –

+0

(+ d.Ticks - 1)は、必要に応じて丸めます。 /と*は丸められています。例12の次の5へ:(12 + 5 - 1)= 16,16/5 = 3(これは整数データ型なので)、3 * 5 = 15. tada :) - Diego Frehner Aug 9 '14 at 10 :13 ------コメントはhttp://stackoverflow.com/questions/7029353/how-can-i-round-up-the-time-to-the-nearest-x-minutes –

答えて

1

これは、希望の精度の半分を加算してから小数点以下を切り捨てる方法でよく使われます。例:

  • 所望の精度:0.1(/ 2 - > 0.05を追加)

    1.44 + 0.05 = 1.49 -> cut last -> 1.4 
    1.46 + 0.05 = 1.51 -> cut last -> 1.5 
    
  • 所望の精度:0.01(/ 2 - > 0.005を追加)

    1.443 + 0.005 = 1.448 -> cut last -> 1.44 
    1.465 + 0.005 = 1.470 -> cut last -> 1.47 
    
  • 所望精度:1分 - > 0.5分または30秒または30000ティック*(1秒= 1000ティックと仮定)。ユニットは、すべての計算でユニットを同じにしておく限り重要ではありません。

    1min 25s + 30s = 1min 55s -> cut -> 1min 
    1min 35s + 30s = 2min 05s -> cut -> 2min 
    

だから、日時とそれは同じです。分単位でラウンドするために、半分の時間を追加し、残りの部分をカットすることができます。

ティックは、時間を表す1つの方法です。だからちょうど1分の目盛り(new TimeSpan(0, 0, 1, 0))を取り、それを2つに分けて半分にしてそれをあなたの時間に加えてください。

ここでは、残りの部分をカットして、の精度である(ティックカウント1分)で時間をダイビングするだけで済みます。 1分で割ると、1分未満のものはすべて小数になります。 Tickは整数なので、すべての小数点を「忘れる」ので、切り捨てられます。これで分けたのと同じ値を乗算することで値を再度有効にするだけです。小数はすでにこの時点で失われているので、... TADAA:分単位で四捨五入。

+0

私は私の答えを削除しました。私は彼を助けることができる解決策を提供することによって考えました。 –

関連する問題