2011-09-14 2 views
12

Double이 문자열 형식으로 지정된 경우 반올림이 사용됩니다. 예 :DateTime의 형식을 밀리 초가 아닌 문자열이 잘리는 이유는 무엇입니까?

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

출력 스트링 절단 사용로서 DateTime 포맷 그러나

12346 

. 예 :

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 

이 동작 뒤에 추론 (있는 경우)이란 무엇입니까

? 가까운 제 반올림


문자열로 포맷하기 전에 0.5 초를 추가함으로써 달성 될 수있다 :이 비트 주관적

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

에게 있지만, I는 말할 그것들을 잘라내는 것과 반대되는 반올림 날짜와 시간 값은 "더 많은"예기치 않은 행동을 초래할 것입니다.

예를 들어, new DateTime(2011, 1, 1, 23, 59, 59, 999)을 반올림하면 완전히 새로운 날이됩니다. 이것은 단순히 값을 잘라 버리는 것보다 훨씬 이상하게 들립니다.

+2

+1, 감사합니다. 그것은 결코 생각하지 못한 차원입니다. –

+1

그리고 새로운 날이 내년이면 반올림이 연중 최대로 이루어집니다. 대부분의 상황에서 아마도 당신이 원하는 날짜가 아닐 것입니다. –

+1

아마도 그것에 대해 생각할 수있는 또 다른 방법 : 시간 단위는 시간이 아닌 _ 시간입니다. 시간 단위는 다음 (동일한) 단위의 시작까지 완전히 확장됩니다. 예를 들어 0.99999의 화요일은 여전히 ​​"수요일"이 아니라 "화요일"으로 간주됩니다. – Spike0xff

0

최종 측정 단위에서 해당 주파수에서 이벤트가 발생하면 반올림은 앨리어싱을 줄입니다.

예를 들어, 지터로 인해 한 프레임의 데이터 프레임이 두 번째 프레임과 다음 프레임으로 2mS 들어가고 동일한 프레임에 990mS가 도착하면 두 프레임 모두 동일한 초로 스탬핑됩니다. 단 몇 밀리 초의 지터는 많은 비 고유 키 값을 분산시킵니다.

반올림하면 지터가 훨씬 더 심각해질 때까지 말끔히 몇 초 안에 넣을 수 있습니다 (예 : +/- 499mS).

반올림 목적은 해상도가 영원히 지속되는 것을 막는 것입니다. 불확실성이 해상도보다 낮 으면 앨리어싱이 엄청나게 줄어 듭니다.

"계단식 배열"은 경계의 해상도보다 작은 경우에만 발생할 수 있습니다. 예를 들어, 전환 연도 번호가 충격적으로 보일 수도 있지만 이는 정오 (새해 한밤중)보다 1 초 (또는 밀리 초 등)보다 작은 에서만 발생할 수 있습니다. 예기치 않은 또는 특히 그 내용이 정확하지 않습니다.

반올림 한 후에 앨리어싱을 방지하려면 (두 번 언급 할 때와 동일한 시간) 앤티 앨리어싱 (그래픽에서와 같이)을 구현해야합니다.

1

이전 질문이지만 새 질문에서 언급했는데 반올림의 이유를 논의하거나 대답하지 않은 경우 (물론 유효 함) 질문에 대답이 없습니다.

반올림하지 않는 이유는 ToString이 요청한 날짜/시간 부분을 인쇄하기 때문입니다.

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

출력 : 없음 매개 변수와

2011-09-03T03:18 

, ToString 사용자 환경의 기본 날짜/시간 형식 문자열을 사용

따라서, 예를 들어, 어느 라운드 가장 가까운 분에이를 것 .

관련 문제