【发布时间】:2016-02-22 00:42:31
【问题描述】:
您好,我是初学者,所以请善待:)..
在 C++ 中,如果我有一个像 12.5 或 13.25 这样的浮点数,我如何将其转换为显示为 12:30 和 13:15?
非常感谢。
【问题讨论】:
-
非常非常糟糕的主意。浮点计算不精确,因此 12.5 最终可能为 12.499999999。使用适当的结构和功能 - cplusplus.com/reference/ctime
标签: c++
您好,我是初学者,所以请善待:)..
在 C++ 中,如果我有一个像 12.5 或 13.25 这样的浮点数,我如何将其转换为显示为 12:30 和 13:15?
非常感谢。
【问题讨论】:
标签: c++
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;
【讨论】:
与任何问题一样,您需要将其分解为各个组成部分并分别进行攻击。
你有什么:
你需要什么:
所以,现在,我们可以解决问题的每个部分。
假设输入是:
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
对于一般解决方案,如果只有一位数字,我们还希望显示前导零:
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
或者,你知道,使用实际的时间/日期类型。
【讨论】: