Следующий код работает не совсем корректно:
...
float dSecondsWithFrac;
::sscanf(strInput, "%2d:%2d:%f", &nHours, &nMinutes, &dSecondsWithFrac);
dMilli = modf(dSecondsWithFrac, &dSeconds);
dMilli *= 1000.0;
int nMilli = dMilli;
...
Если ввести, например, 0:0:0.005, то dSecondsWithFrac получит значение 0.0049999999. Почему не 0.005? Как следствие, дальше имеем проблему с погрешностью. nMilli становится равным 4 (4.99 -> преобразование в int -> 4) вместо положенных 5. Можно использовать ceil, но она подходит не во всех случаях.
Как можно разрулить эту ситуацию? Может быть есть такая функция, которая возвращает значение, округленное следующим образом: 29.1 -> 29, 29.9 -> 30?