¿Por qué formatear un DateTime como una cadena se trunca y no redondea los milisegundos?

Cuando unDouble tiene el formato de redondeo de cadena. P.ej

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

salidas

12346

Sin embargo, cuando unDateTime está formateado como se utiliza un truncamiento de cadena. P.ej

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));

salidas

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

¿Cuál es el razonamiento (si lo hay) detrás de este comportamiento?

e puede lograr @Rondear al segundo más cercano agregando medio segundo antes de formatear como una cadena:

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));

salidas

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta