#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.为什么它发生了吗?为什么答案与计算机和手动计算不同?
答案 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();
}
这将产生您想要的输出,只需浮动。