如何将浮点数切换为时间格式?

时间:2016-02-22 00:42:31

标签: c++

你好,我是一个乞丐,所以请保持友善:)..

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

非常感谢你。

2 个答案:

答案 0 :(得分:2)

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;

答案 1 :(得分:1)

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

你有什么:

  • 浮点数小时。

你需要什么:

  • 打印整数小时。
  • 打印“:”
  • 以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

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