【问题标题】:How can you switch a float to a time format?如何将浮点数转换为时间格式?
【发布时间】:2016-02-22 00:42:31
【问题描述】:

您好,我是初学者,所以请善待:)..

在 C++ 中,如果我有一个像 12.5 或 13.25 这样的浮点数,我如何将其转换为显示为 12:30 和 13:15?

非常感谢。

【问题讨论】:

  • 非常非常糟糕的主意。浮点计算不精确,因此 12.5 最终可能为 12.499999999。使用适当的结构和功能 - cplusplus.com/reference/ctime

标签: c++


【解决方案1】:
float time = ...;

简单地将浮点数转换为 int 将切断小数部分,为您留下几个小时。

int hour = static_cast<int>(time);

如果您减去小时数,那么剩下的就是分钟数,即小时的几分之一。如果将其乘以 60,则以分钟为单位得到余数。再次,转换为 int 以减少秒数,只剩下分钟数。

int minute = static_cast<int>((time-hour)*60);

然后显示小时数和冒号。要正确显示分钟,请告诉它始终使用 2 个字符的宽度,并用“0”填充空白。这使它说02 而不仅仅是2

std::cout << hour << ':' << std::setw(2) << std::fill('0') << minute;

【讨论】:

    【解决方案2】:

    与任何问题一样,您需要将其分解为各个组成部分并分别进行攻击。

    你有什么:

    • 浮点数小时数。

    你需要什么:

    • 打印整数小时数。
    • 打印“:”
    • 以 60 分钟的比例打印小数小时数。

    所以,现在,我们可以解决问题的每个部分。

    假设输入是:

    const float time = 13.25;
    

    第一部分非常简单——截断浮点变量可以使用数学函数floor 来完成,但您真正需要做的只是转换为int 以获得相同的效果:

    std::cout << (unsigned int)time;
    

    第二部分也很简单:

    std::cout << ':';
    

    第三部分需要更多的工作。我们需要丢弃除小数部分以外的所有内容。 We can do that by subtracting the integer part:

    time - (unsigned int)time
    

    然后我们必须转换值,使其不是范围 [0.00,1.00) 的比例,而是范围 [0,60) 的比例,只需乘以 60:

    60 * (time - (unsigned int)time)
    

    我们只剩下:

    const float time = 13.25;
    std::cout << (unsigned int)time;
    std::cout << ':';
    std::cout << 60 * (time - (unsigned int)time);
    // result: 13:15
    

    (live demo)


    对于一般解决方案,如果只有一位数字,我们还希望显示前导零:

    const float time = 12.10;
    std::cout << (unsigned int)time;
    std::cout << ':';
    std::cout << std::setw(2) << std::setfill('0');
    std::cout << 60 * ((time - (unsigned int)time) / 100);
    // result: 12:06
    

    实际上,为了避免舍入错误和可能的溢出,您应该完全删除 float 并简单地存储整数分钟:

    const unsigned int time_mins = (12*60) + 6;
    std::cout << (time_mins / 60);
    std::cout << ':';
    std::cout << std::setw(2) << std::setfill('0');
    std::cout << (time_mins % 60);
    // result: 12:06
    

    (live demo)

    或者,你知道,使用实际的时间/日期类型。

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 2022-01-17
      • 2023-03-20
      • 2019-06-20
      • 2019-01-06
      • 1970-01-01
      • 2023-03-21
      • 2018-12-23
      相关资源
      最近更新 更多