As you’ve found out yourself, it’s a documented feature. It’s described in the documentation of TimeSpan:
Parameters
value Type: System.Double
A number of seconds, accurate to the nearest millisecond.
The reason for this is probably because a double is not that accurate at all. It is always a good idea to do some rounding when comparing doubles, because it might just be a very tiny bit larger or smaller than you’d expect. That behaviour could actually provide you with some unexpected nanoseconds when you try to put in whole milliseconds. I think that is the reason they chose to round the value to whole milliseconds and discard the smaller digits.