程序输出与手动计算不同,为什么会发生这种情况? C语言

时间:2017-09-19 18:30:29

标签: c

#include <stdio.h>
#define s scanf
#define p printf
void main (){
    int P,I,A;
    float T,R;
    clrscr();
    p("PRINCIPAL: ");
    s("%i",&P);
    p("RATE: ");
    s("%f",&R);
    p("TERM: ");
    s("%f",&T);
    R = R/100;
    I = P*R*T;
    A = P+I;
    p("I: %i\nMA: %i",I,A);
    getch();
}

这真让我烦恼,如果我把PRINCIPAL:1200 RATE:3 TERM:1 I:35 MA:1235但是如果你手动计算答案应该是I:36 MA:1236这个数字减少了1.为什么它发生了吗?为什么答案与计算机和手动计算不同?

3 个答案:

答案 0 :(得分:1)

您尝试将float强制转换为导致数据丢失的int。就像我们无法将大物件存放在小袋子中一样。

#include <stdio.h>
#define s scanf
#define p printf
int main (){
    int P;
    float T,R,I,A;
    p("PRINCIPAL: ");
    s("%i",&P);
    p("RATE: ");
    s("%f",&R);
    p("TERM: ");
    s("%f",&T);
    R = R/100;
    I = P*R*T;
    A = P+I;
    p("\nI: %f\nMA: %f",I,A);
    return 0;
}

答案 1 :(得分:0)

您的问题在于float转换为int。如果您使用键入float的所有内容执行程序,则会得到预期结果:

#include <stdio.h>
#define s scanf
#define p printf
int main (){
    float P,I,A;
    float T,R;

    p("PRINCIPAL: ");
    s("%f",&P);
    p("RATE: ");
    s("%f",&R);
    p("TERM: ");
    s("%f",&T);
    R = R/100;
    I = P*R*T;
    A = P+I;
    p("I: %f\nMA: %f",I,A);

    return 0;
}

输出:

PRINCIPAL: 1200
RATE: 3
TERM: 1
I: 36.000000
MA: 1236.000000

但是,当您将float值转换为int时,您只需取整数部分;小数点右侧的所有内容都将被删除。因此,即使它在我这样做时打印为36.000000,由于浮点数学的不精确,I的值可能会出现在35.9999999之间,并且由于显示过程中的舍入而简单地显示为36.000000。在这种情况下,你只需要获得35,并失去其他一切。

要解决您的问题,请将所有内容保留为float,或将float转换为int进行四舍五入 - 例如,使用lroundf math.h - 而不仅仅是投射它们。

答案 2 :(得分:0)

你的问题是关于类型转换,请研究这个主题,看看这个,这里有一点简单的解释。 但我可以告诉你,在从float转换为int时,你可能会丢失信息,因为C中的这两种原始类型具有不同的最大长度。 你可以看到变换int变量浮动并再次运行你自己的程序,如下所示:

#include <stdio.h>
#define s scanf
#define p printf
void main (){
    float P,I,A;
    float T,R;
    p("PRINCIPAL: ");
    s("%f",&P);
    p("RATE: ");
    s("%f",&R);
    p("TERM: ");
    s("%f",&T);
    R = R/100;
    I = P*R*T;
    A = P+I;
    p("I: %f\nMA: %f",I,A);
    getch();
}

这将产生您想要的输出,只需浮动。