2011-09-14 58 views
12

當使用字符串舍入格式化Double時。例如。爲什麼將DateTime格式化爲字符串截斷而不是毫秒數?

Console.WriteLine(12345.6.ToString("F0")); 

輸出

12346 

然而,當作爲字符串截斷使用DateTime被格式化。例如。

var ci = CultureInfo.InvariantCulture; 
var dateTime = DateTime.Parse("2011-09-14T15:18:42.999", ci); 
Console.WriteLine(dateTime.ToString("o", ci)); 
Console.WriteLine(dateTime.ToString("s", ci)); 
Console.WriteLine(dateTime.ToString("yyyy-MM-hhThh:mm:ss.f", ci)); 

輸出

2011-09-14T15:18:42.9990000 
2011-09-14T15:18:42 
2011-09-14T15:18:42.9 

什麼是推理(如果有的話),這種行爲背後?


四捨五入到最接近的第二個可以通過添加半秒格式化爲一個字符串之前實現:

var ci = CultureInfo.InvariantCulture; 
var dateTime = DateTime.Parse("2010-12-31T23:59:59.999", ci); 
Console.WriteLine(dateTime.ToString("s", ci)); 
var roundedDateTime = dateTime.AddMilliseconds(500); 
Console.WriteLine(roundedDateTime.ToString("s", ci)); 

輸出

2010-12-31T23:59:59 
2011-01-01T00:00:00 

回答

16

這是有點主觀的,但我會說舍入日期和時間值而不是截斷它們會導致「更多」意外行爲。

例如,四捨五入new DateTime(2011, 1, 1, 23, 59, 59, 999)將導致新的一天完全。這聽起來比截斷值更奇怪。

+2

+1,謝謝。這是我從未想過的一個維度。 –

+1

如果新的一天是在下一年,那麼舍入級數一直到今年。在大多數情況下,可能不是你想要的日期。 –

+1

也許另一種思考方式:時間單位是_spans_而不是時間點。單位時間完全延伸到下一個(同一)單位的開始。因此,例如通過週二的0.99999仍被視爲「星期二」 - 而不是「星期三」。 – Spike0xff

0

在測量的最後的單元,如果有事件發生時在該頻率,四捨五入削減對混疊方式向下。例如,如果抖動使得一秒鐘的數據幀進入第二秒,而下一幀到達990毫秒到同一幀,則它們都將被標記爲在同一秒鐘內。只有幾毫秒的抖動會導致許多分散的非唯一鍵值。

四捨五入可以將他們放入幾秒鐘乾淨 直到抖動得更加厲害,說+/- 499毫秒。

四捨五入的目的是阻止決議永遠持續下去。 當不確定性低於分辨率時,它會極大地減少鋸齒。

「級聯」只能發生在不到邊界的分辨率。 例如,切換年數似乎令人震驚,但這種情況只會發生在比新年午夜時分少一秒(或毫秒等)的 以下。沒有意外的 或特別不準確。

爲了真正防止鋸齒(同時提及兩次),需要在舍入後實施 抗鋸齒(如圖形所示)。

1

老問題,但它已經從一個新的簡稱,答案討論四捨五入或不(這當然是有效的)原因而離開,沒有回答這個問題。

的理由不四捨五入是,ToString只打印你問的日期/時間部分。

因此,例如,既沒有將它四捨五入到最接近的分鐘:

Console.WriteLine(dateTime.ToString("yyyy-MM-hhThh:mm", ci)); 

輸出:

2011-09-03T03:18 

如果沒有參數,ToString使用環境的默認日期/時間格式字符串。

相關問題