Результат деления всегда равен нулю

Я получил этот код C.

#include <stdio.h>

int main(void)
{
        int n, d, i;
        double t=0, k;
        scanf("%d %d", &n, &d);
        t = (1/100) * d;
        k = n / 3;
        printf("%.2lf\t%.2lf\n", t, k);
        return 0;
}

Я хочу знать, почему моя переменная 't' всегда равна нулю (в функции printf)?


person VaioIsBorn    schedule 27.02.2010    source источник
comment
См. также stackoverflow.com/questions/1580332/   -  person GManNickG    schedule 27.02.2010
comment
лол - целочисленное деление в c тоже было моей первой головной болью. Тогда никакого переполнения стека - просто безжалостный проф.   -  person Shane C. Mason    schedule 27.02.2010


Ответы (4)


потому что в этом выражении

t = (1/100) * d;

1 и 100 - целые значения, целочисленное деление усекается, так что это то же самое, что и это

t = (0) * d;

вам нужно сделать это константой с плавающей запятой, подобной этой

t = (1.0/100.0) * d;

вы также можете сделать то же самое с этим

k = n / 3.0;
person John Knoeller    schedule 27.02.2010
comment
Или просто используйте d / 100.0. - person Joey; 27.02.2010
comment
В моей ситуации это то, что я сделал, чтобы перестать получать 0 для своего подразделения: Double ratio = (Convert.ToDouble(x) / Convert.ToDouble(y)); - person Christopher D. Emerson; 18.10.2018
comment
@ChristopherD.Emerson Это C#; этот вопрос касается C (и также относится к C++). - person TamaMcGlinn; 09.08.2020

Вы используете целочисленное деление, и 1/100 всегда округляется до нуля в целочисленном делении.

Если вы хотите выполнить деление с плавающей запятой и просто усечь результат, вы можете убедиться, что вместо этого используете литералы с плавающей запятой, и d будет неявно преобразован для вас:

t = (int)((1.0 / 100.0) * d);
person MikeP    schedule 27.02.2010

Я думаю, это из-за

t = (1/100) * d;

1/100 как целочисленное деление = 0

тогда 0 * d всегда равно 0

если вы сделаете 1.0/100.0, я думаю, это будет работать правильно

person Eric    schedule 27.02.2010

t = (1/100) * d; 

Это всегда равно 0, вы можете сделать это

t=(1%100)*d 

и добавить его к 0

person Alex    schedule 13.11.2016