Проблемы с точностью в scanf
От: Аноним  
Дата: 28.06.04 00:15
Оценка:
Следующий код работает не совсем корректно:

...
    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?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.