Почему это целочисленное деление дает 0? - PullRequest
4 голосов
/ 11 января 2012

Может кто-нибудь сказать мне, почему следующий код выводит 0 в отмеченной строке?

Кажется, что все правильно, но потом, когда я пытаюсь получить результат ближе к концу, он каждый раз дает мне 0.

#include <stdio.h>

int main() {

    // Gather time-lapse variables

    int frameRate, totalLengthSecs;
    printf("How many frames per second: ");
    scanf("%i", &frameRate);
    printf("--> %i frames confirmed.", frameRate);
    printf("\nDesired length of time-lapse [secs]: ");
    scanf("%i", &totalLengthSecs);
    printf("--> %i seconds confirmed.", totalLengthSecs);
    int totalFrames = frameRate * totalLengthSecs;
    printf("\nYou need %i frames.", totalFrames);

    // Time-lapse interval calculation

    int timeLapseInterval = totalLengthSecs / totalFrames;

    printf("\n\n%i", timeLapseInterval); // <-- this prints 0

    return 0;
}

Ответы [ 4 ]

4 голосов
/ 11 января 2012

Вкратце: целочисленное деление усекает

Вам необходимо следующее:

double timeLapseInterval = (double) totalLengthSecs / (double)totalFrames;
printf("\ntimeLapseInterval : %f \n", timeLapseInterval);
3 голосов
/ 11 января 2012

Вы выполняете целочисленную математику.

Математика между двумя целыми числами даст целое число.И результат будет округлен до нуля.

Эта строка:

totalLengthSecs / totalFrames;

Вероятно, будет результат, который находится между 0 и 1.И округляется до 0

1 голос
/ 11 января 2012

Вы печатаете целые числа, и поэтому оно округляет значение.

timeLapseInterval / totalFrames будет (1 / frameRate), что будет <1, если frameRate не равен 1 (или 0, в этом случае у вас ошибка деленияна 0) </p>

0 голосов
/ 11 января 2012

Когда вы делите 2 числа в C и знаменатель является целым числом, компилятор представляет его как целочисленное деление. Следовательно, если вы разделите 1 на 2, он вернет ноль, а не 0,5

Более того, ваша выходная переменная также является целым числом, поэтому, если вы ожидаете десятичные значения, вы не получите ее.

Вы можете исправить это, выполнив:

float timeLapseInterval = totalLengthSecs / (float) totalFrames;

printf ("\ n \ n% f", timeLapseInterval);

Надеюсь, это поможет

...