C++如何编写while循环仅接受两位小数的float格式时间合法输入
校验时间输入的while循环实现方案
原代码存在的问题
- 仅校验了数值范围在012之间,未校验小数部分是否符合分钟的取值要求(分钟必须在059之间,例如
9.61、10.70这类输入都是不合法的) - 没有处理非数字输入的异常场景,如果用户输入字母、符号等非浮点数内容,cin会进入错误状态,原循环会直接终止,不符合需求
修改后代码
#include <iostream> #include <cmath> #include <limits> using namespace std; int main() { float time; cout << "请输入时间:"; while (true) { // 判断输入是否为合法浮点数 if (cin >> time) { int hour = static_cast<int>(time); // 四舍五入避免浮点数精度误差导致分钟计算错误 int minute = static_cast<int>(round((time - hour) * 100)); // 自定义校验规则,可根据需求调整边界值 if (hour >= 0 && hour <= 12 && minute >= 0 && minute <= 59) { break; } else { cout << "输入无效,请输入合法的时间:"; } } else { // 处理非数字输入的错误状态 cin.clear(); // 清空缓冲区残留的非法输入 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "输入无效,请输入合法的数字:"; } } // 此处接续上午/下午判断逻辑 return 0; }
关键逻辑说明
- 浮点数拆分:把输入的数值拆分为小时的整数部分和分钟的小数部分,单独校验分钟的取值范围,避免出现分钟超过59的非法值
- 精度处理:用
round()方法对计算出的分钟做四舍五入,解决浮点数存储精度不足导致的计算偏差(比如输入9.24实际存储为9.239999999,直接取整会得到23而不是24的问题) - 异常处理:当用户输入非数字内容时,先清空cin的错误标记,再清空输入缓冲区的残留内容,保证循环可以正常接收后续输入
内容的提问来源于stack exchange,提问作者Georges St-Isidore
相关产品推荐
相关产品推荐

