【问题标题】:Why do I lose the remainder of a value after performing arithmetic in C?为什么我在 C 中执行算术后会丢失一个值的余数?
【发布时间】:2015-07-16 18:34:03
【问题描述】:

我正在尝试通过遵循textbook 来学习基本的 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 <stdio.h>
#include <conio.h>
#include <string.h>

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 大师可以使用更先进的技术以更简洁的形式编写程序的安全版本。如果您想提及它,这也可能具有教育意义,但首先我需要了解这个简单程序发生了什么。

【问题讨论】:

标签: c


【解决方案1】:

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

 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

【讨论】:

  • 非常感谢。我想知道我是否在书中错过了这一点,或者这是否是新信息。我将不得不仔细检查。无论哪种方式,这都非常有帮助,我会接受它作为解决方案,谢谢!
  • 更清晰的解释:整数除法的结果是C中的整数,小数部分被丢弃。将其中一个整数转换为浮点数将其转换为按预期工作的浮点除法
  • 虽然 O.P. 打算进行浮点除法,但您至少应该警告他这种方法会出现严重的舍入错误 - 并告知余数运算符。可以吗?
  • 或者没有强制转换:min = sec; min /= secpermin;
  • 在分配hr 时也不需要转换,因为min 已经输入float。简短:min/minperhour; 不是整数除法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2016-08-10
相关资源
最近更新 更多