为什么在C中执行算术后会丢失剩余的值?

我正在尝试通过遵循教科书来学习基本的C编程,我必须缺少关于数据类型,舍入和/或操作顺序的一些东西,因为当我尝试构建一个简单的程序来将秒转换为小时和分钟时,小时工作,但剩下的分钟在不应该的时候达到0。

感谢Coursera ,我知道这样的程序存在巨大的安全漏洞,但出于学习目的,我会要求您忽略安全性。 现在,书籍要我坚持使用printfscanfwhile循环,因为它们对应于我正在阅读的教科书的章节(书籍让我知道,当我开始时,我会开始担心安全问题进一步的几章。

我的C程序看起来像这样:

 /* Ask the user for a number of seconds, convert to X hours and Y minutes */ /* Continue doing this with a while loop until user enters 0 */ #include  #include  #include  int main(void) { const int minperhour = 60; const int secpermin = 60; int sec, hr; float min; sec = 1; while(sec != 0) { printf("Enter the number of seconds to convert: \n"); scanf("%i", &sec); min = sec/secpermin; hr = min/minperhour; min = (sec/secpermin) - (hr * minperhour); printf("%d hours and %f minutes \n", hr, min); } return 0; } 

我希望我可以输入3601 ,结果将是:

1 hours and 0.01667 minutes

因为这是表达式在R语言中的评估方式,我更熟悉它:

 > min = 3601/60 > min [1] 60.02 > hr = min/60 > hr [1] 1 > min = (3601/60) - (1 * 60) > min [1] 0.01667 

但是,我在C中得到的是:

 C:\Users\hackr>pa2q3.exe Enter the number of seconds to convert: 3601 1 hours and 0.000000 minutes Enter the number of seconds to convert: 7205 2 hours and 0.000000 minutes Enter the number of seconds to convert: 0 0 hours and 0.000000 minutes C:\Users\hackr> 

为了好的措施,我投入了7205秒的第二次尝试。

我有一种感觉,Stack Overflow上的一些C大师可以使用更高级的技术以更简洁的forms编写程序的安全版本。 如果你想提及它,这也可能具有教育意义,但首先我需要了解这个简单程序正在发生什么。

整数除法:除以两个整数后的整数值以浮点格式存储。 例如:

  float a = 3/5; 

这里整数除法将在35之间出现,结果为0 。 现在,如果您尝试将此0存储在float变量中,它将存储为0.00

  min = sec/secpermin; 

应该

  min = (float)sec/secpermin; 

要么

  min = sec/(float)secpermin; 

或者,正如@alk指出的那样,你也可以这样做:

  min = sec; min /= secpermin; // min=min/secpermin; here, typecasting is not required as // numerator (min) is already float. 

或者,您可以将它们全部float ,并在打印时将它们转换为int