C++如何在fraction类初始化外构造赋值对象 规避浮点重载精度问题
推荐的规范实现方案
1. 优先实现带参数的构造函数
这是C++类的标准用法,不需要自定义额外的construct辅助函数,直接在fraction类里定义公开的带参构造函数:
class fraction { private: int numerator; int denominator; public: // 带参构造函数,默认分母为1,可以兼容整数转分数的场景 fraction(int num, int den = 1) { if (den == 0) { // 这里可以加异常抛出或者错误处理逻辑 throw std::invalid_argument("分母不能为0"); } numerator = num; denominator = den; simplify(); // 构造时直接化简,保证分数始终是最简形式 } // 其余成员函数省略 };
实现后你就可以直接用如下方式给已初始化的对象赋值:
a = fraction(1, 3); // 完全没有精度问题,直接传递整数分子分母
2. 使用C++列表初始化简化写法
如果你的编译环境支持C++11及以上标准,且构造函数没有用explicit修饰,还可以写得更简洁:
a = {1, 3};
3. 关于float转换的精度问题说明
你遇到的无限小数精度丢失问题是二进制浮点类型的固有特性,和你的转换逻辑无关:类似1/3的数值本身就无法用float类型精确存储,你拿到的float值本身就是近似值,转换后自然会出现误差。如果需要精确的分数表达,直接使用上述传入分子分母两个整数的赋值方式即可,不要走浮点转换的路径。
内容的提问来源于stack exchange,提问作者KhiemGOM
相关产品推荐
相关产品推荐

