• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zaokragalnie godzin w górę do pelnich dni .

0 głosów
40 wizyt
pytanie zadane 9 stycznia w C i C++ przez użytkownika sh1nen Obywatel (1,490 punkty)

Podczas programowania napotkałem na zaiscie prosty przypadek, natomiast mimo wielu godzin prób i błędówzdecydowałem się skierować pytanie na forum gdyż chyba nie dojdę to tego sam. Mianowicie chciałbym aby w momencie odejmowania od siebie odpowiednich dat, po wyliczeniu otrzymywać ilość dni jakie dane wypożyczenie trwało, problem polega na tym, że chciałbym aby przypadek np. wypożyczenia trwającego 3h rozpatrywano jako dzień, 25h jako 2 dni itd.
 

boost::posix_time::time_duration td = datę_end - datę_start;
int hours = td.total_milliseconds() / (1000*60*60); // 1000 - second / 60 - minutes / 60 - hours / 24 - day
if(hours % 24 == 0)
return hours / 24;
else
return ceil(hours / 24);


Jak widać wyżej, otrzymaną różnicę w czasie, sprowadzam do milisekund, następnie zamieniam na godziny i w warunku staram się jakoś ogarnąć temat zaokroglania do całości, natomiast jak już przetestowałem jest to drogą do nikad, prosiłbym o jakieś wskazówki jak dany problem mógłbym rozwiazć, bo jak mniemam jest on niezwykle prosty ;/

2 odpowiedzi

0 głosów
odpowiedź 9 stycznia przez użytkownika Criss Szeryf (91,900 punkty)
 
Najlepsza

Po pierwsze powinieneś operować na typach (pseudo)rzeczywistych, żeby zakrąglanie (ceil) miało jakikolwiek sens.

Ja bym zrobił tak:

boost::posix_time::time_duration td = datę_end - datę_start;
double days = static_cast<double>(td.total_milliseconds()) / (1000 * 60 * 60 * 24); 
if(static_cast<long>(days) == days) //jesli liczba jest calkowita
   return days;
else
   return ceil(days);

Zamiast modulo od razu przeszedłem na liczbe dni i wykorzystałem taką sztuczke na sprawdzanie czy liczba jest całkowita, bo modulo dla typów niecałkowitych nie istnieje.

0 głosów
odpowiedź 9 stycznia przez użytkownika Jakub Wolak Obywatel (1,260 punkty)
Zmień ceil ( hours / 24 ) na ceil ( hours / 24.0 ), a także typ zmiennej hours na float.

Podobne pytania

0 głosów
1 odpowiedź 85 wizyt
pytanie zadane 9 stycznia 2016 w PHP, Symfony, Zend przez użytkownika McFiery Początkujący (250 punkty)
0 głosów
1 odpowiedź 77 wizyt
pytanie zadane 2 listopada 2015 w C i C++ przez użytkownika tomasztopolewski Początkujący (430 punkty)
0 głosów
3 odpowiedzi 99 wizyt
pytanie zadane 22 grudnia 2016 w PHP, Symfony, Zend przez użytkownika powrooz666 Nowicjusz (200 punkty)
...