int main () {
    float hour, dec, Dec_Only, min2, sec;
    int res, r, min, whole, min3, sec2, sec3;
    
    printf ("Enter hours: ");
    scanf ("%f", &hour);
    
    //Displaying initial minutes
    min = hour * 60;
    printf ("%d minutes\n", min);

    if (hour == 0.0){
        res = min / 60;
        r = min % 60;
    
        printf("%02d : %02d : 00", res, r);
    }
    else {
        //Getting hours
        whole = (int)hour;
        dec = (hour - whole) * 100;
    
        //Getting minutes
        Dec_Only = hour - whole;
        min2 = Dec_Only * 60;
        min3 = (int)min2;
        
        //Getting seconds
        sec = min2 - min3;
        sec2 = sec * 60;
        sec3 = (int)sec2;
    
        printf ("%02d : %02d : %02d", whole, min3, sec3 );
    }
    
    return 0;
}

你好,我是C语言的新手.我的工作是将小时转换成数字时钟(我需要使用条件语句). 我添加了一个条件语句,当user_input只包含1个或更多的十进制数时.我的代码工作,但是,当我输入特定的数字5.2时,问题就来了.

输入小时数(USER_INPUT):5.2 输出:05:11:59

我想要的输出:05:12:00

PS:当我输入任何其他数字时,它都起作用了.

推荐答案

关键的问题是,输入"5.2"的结果是float near,但也不完全是5.2.这是因为float被编码为有限整数乘以2的幂,而不能编码5.2. 5.19999980926513671875

使用min = lroundf(hour * 60);(从<math.h>)到roundfloat的乘积与最接近的long相乘,而不是min = hour * 60,后者将truncated的值赋给min.

其余代码不应再次使用hours或浮点数. 使用整数数学.


更好的做法是:先将hours转换为整数秒.

    #define SEC_PER_HOUR_FP (60.0 * 60) 
    long total = lround(hour * SEC_PER_HOUR_FP);
    int s = total%60;
    total /= 60;
    int m = total%60;
    total /= 60;
    long h = total;
    printf ("%02ld : %02d : %02d", h, m, s);

C++相关问答推荐

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

来自stdarg.h的c中的va_args无法正常工作<>

将fget()与strcMP()一起使用不是正确的比较

自定义变参数函数的C预处置宏和警告 suppress ?

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

如何在C中打印包含扫描字符和整数的语句?

==284==错误:AddressSaniizer:堆栈缓冲区下溢

我在C中运行和调试时得到了不同的输出

pthread_create的用法

C:如何将此代码转换为与数组一起使用?

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

从整型转换为浮点型可能会改变其值.

Linux/C:带有子进程的进程在添加waitid后都挂起

C中的空指针是什么(_N)?

Malloc和对齐

';malloc():损坏的顶部大小';分配超过20万整数后

通过char*访问指针的对象表示是未定义的行为吗?

分支预测和UB(未定义的行为)

c 函数指针,另一种语法

用于内存布局的size命令(文本、数据、bss)