#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: %inMA: %i",I,A);
getch();
}
这确实让我感到困扰,如果我放置校长:1200率:3术语:1 I:35 MA:1235,但是如果您手动计算答案应该是I:36 MA:1236数字减少1.为什么发生了吗?答案为什么与计算机和手册计算有所不同?
您尝试将造成一些数据丢失的float
输入CC_1。就像我们无法将大物体存储在小袋中一样。
#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: %fnMA: %f",I,A);
return 0;
}
您的问题与打字有关,请研究此主题,请看一下,在这里简单的文本中可以解释一下。但是我可以告诉你,从浮点到int铸造时,您可能会丢失信息,因为C中这两种原始类型的最大长度不同。您可以看到Changin 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: %fnMA: %f",I,A);
getch();
}
这将产生您所需的输出。
您的问题在于将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: %fnMA: %f",I,A);
return 0;
}
输出:
PRINCIPAL: 1200
RATE: 3
TERM: 1
I: 36.000000
MA: 1236.000000
但是,当您将float
值转换为int
时,您只需将整数零件即可;小数点右侧的所有内容都被删除了。因此,即使我这样做时它的打印为36.000000,也可能由于浮点数数学的不精确性而可能出现35.9999999之类的价值,并且仅显示为36.000000,因此显示为36.000000。在这种情况下,您只会得到35,然后丢失其他所有内容。
要解决您的问题,要么将所有内容作为float
留下,要么通过将float
s舍入将其转换为int
S,例如,使用lroundf
在math.h
中使用CC_12,即仅施放它们。