Округление с с - PullRequest
       7

Округление с с

0 голосов
/ 11 октября 2019

Я пытаюсь конвертировать в часы и минуты, начиная со времени (записанного в массиве), в минуты с полуночи. Но я вижу, что есть ошибка округления. Например, время отправления 583 (минуты с полуночи), подсчет времени и минут примерно так:

583/60 = 9.716666

Я принимаю целую часть (9) часов. Затем я беру десятичную часть и делаю это:

0.716666 * 60 = 42.99996

Минуты будут 43, но, к сожалению, я не могу экстраполировать это значение, округляя его.

Какая-то идея?

#include <stdio.h>

#define SIZE (int)sizeof(departures) / sizeof(departures[0])

int main(void) {
    int hours, minutes, mmin, fh, fm;
    float res;

    int departures[] = {480, 583, 679, 767, 840, 945, 1140, 1305};
    int Arrivals[]   = {616, 712, 91, 900, 968, 1075, 1280, 1438};

    for(int i = 0; i < SIZE; i++) {
        res = (float)departures[i] / 60;
        fh  = departures[i] / 60;
        fm  = ((float)departures[i] / 60 - fh) * 60;

        printf("%d) %d:%d (%f)\n", i, fh, fm, res);     
    }   

    return 0;
}

Ответы [ 3 ]

3 голосов
/ 11 октября 2019

Вы можете использовать функцию раунда:

#include <stdio.h>
#include <math.h>
 int main()
{
       float i=5.4, j=5.6;
       printf("round of  %f is  %f\n", i, round(i));
       printf("round of  %f is  %f\n", j, round(j));
       return 0;
}

Выход:

раунд 5.400000 - 5.000000

раунд 5.600000 - 6.000000

1 голос
/ 11 октября 2019

С операцией с остатком % не требуется вообще ничего с плавающей точкой. Это более численно стабильно.

#include <stdio.h>  /* size_t printf */

int main(void) {
    unsigned departures[] = {480, 583, 679, 767, 840, 945, 1140, 1305};
    const size_t departures_size = sizeof departures / sizeof *departures;
    size_t i;

    for(i = 0; i < departures_size; i++)
        printf("%lu) %u:%u\n", (unsigned long)i,
        departures[i] / 60, departures[i] % 60);

    return 0;
}

Я изменил int на unsigned int, чтобы знать, что у него нет негативов. См. Этот вопрос , почему. Это дает,

...
1) 9:43
0 голосов
/ 11 октября 2019

Вы делаете следующее:

583/60 = 9.716666

Я занимаю всю часть (9) часов. Затем я беру десятичную часть и делаю это:

0.716666 * 60 = 42.99996

Почему бы вам не сделать это так?

583/60 =9.716666

Вы принимаете всю часть (9) часов. Затем вы делаете это:

583 - (9 * 60) = 43

Таким образом, вам не нужно округлять: -)

...