Я хочу, чтобы преобразовать time_duration в формат DATE, что число дней с 1899 года, 12, 30.Преобразование TIME_DURATION в DATE
DATE date_from_duration(time_duration td)
{
double days = td.hours()/24.+td.minutes()/(24.*60.)+td.seconds()/(24.*60.*60.);
return days;
}
Этот код почти работает, но дает иногда ошибки округления, Ф.И. time_duration(1007645, 15, 0)
должно закончиться в 2014-12-12 00:15:00, но на самом деле 2014-12-12 00:14:59.
Проверка DATE производится с помощью этого метода, украдена из here:
ptime pTime_from_DATE(double date)
{
using boost::math::modf;
static const ptime::date_type base_date(1899, Dec, 30);
static const ptime base_time(base_date, ptime::time_duration_type(0,0,0));
int dayOffset, hourOffset, minuteOffset, secondOffset;
double fraction = fabs(modf(date, &dayOffset)) * 24; // fraction = hours
fraction = modf(fraction, &hourOffset) * 60; // fraction = minutes
fraction = modf(fraction, &minuteOffset) * 60; // fraction = seconds
modf(fraction, &secondOffset);
ptime t(base_time);
t += ptime::time_duration_type(hourOffset, minuteOffset, secondOffset);
t += ptime::date_duration_type(dayOffset);
return t;
}
Любые идеи, как эффективно решить эту проблему округления?
Почему вы делаете все эти расчеты, когда именно для этого была создана библиотека? Я не понимаю. Я опубликовал гораздо более простой ответ. – sehe
Вы можете обойтись без плавающих точек, и у вас не будет проблем округления и округления :) –