你好,我是一个乞丐,所以请保持友善:)..
在C ++中,如果我有一个像12.5或13.25这样的浮点数,如何将其转换为显示为12:30和13:15?
非常感谢你。
答案 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)
与任何问题一样,您需要将其分解为其组成部分并分别攻击每个组件。
你有什么:
你需要什么:
所以,现在,我们可以解决问题的每个部分。
让我们说输入是:
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
或者,你知道,请使用实际的时间/日期类型。