C++ Cube类体积计算:是否需用两位小数float及setPrecision疑问
问题解答
问题背景
我正在编写一个Cube类,需实现体积计算功能。该类支持用户输入float类型的长、宽、高,取值范围为1至45.00;若输入数值超出此范围,所有边长将默认设为1。现有代码框架如下:
#define LIMIT_UNDER 1 #define LIMIT_UPPER 45.00 class Cube { float height; float width; float length; public: // Write setter getters here // default constructor Cube() { // default constructor puts default values height = width = length = LIMIT_UNDER; Cube(float cHeight, float cWidth, float cLength) { height = cHeight; width = cWidth; length = cLength; } float getVolume() { return height * width * length; } }; int main() { // Default constructor called Cube cube; // Parametized called Cube cube2(2.00f, 2.57f, 5.40f); // Show volume to 2 // decimal places as 45.00 // is limit that has two decimal places cout << getVolume() << fixed << setPrecision(2); )
疑问
在计算过程及定义float值(如5.40f)时,是否都需要保留两位小数?就像我在main函数中使用setPrecision(2)设置输出格式那样。
解答
不需要,具体原因和注意事项如下:
定义float值时:写
5.40f和5.4f在内存中的存储完全一致,float是二进制浮点数,不会因为你写了两位小数就额外保留精度。你写5.40f只是代码书写格式,对实际存储和计算没有影响。如果要确保输入值符合两位小数的精度要求,应该在输入验证或赋值阶段做处理(比如将输入值四舍五入到两位小数),而非靠定义时的书写格式。计算过程中:float的计算基于自身二进制精度执行,强制保留两位小数属于多此一举,甚至可能引入不必要的精度损失。你只需要在最终输出结果时,用
fixed << setPrecision(2)格式化显示为两位小数即可。
另外,你的代码还有几个小问题需要修正:
- 带参构造函数缺少范围校验逻辑,需要判断输入的长、宽、高是否在1~45.00范围内,若超出则将三个边长都设为
LIMIT_UNDER - main函数中调用
getVolume()时,需要指定对象,比如cube.getVolume()或cube2.getVolume(),否则会编译报错 - main函数末尾的括号写错了,应该是
}而非)
内容的提问来源于stack exchange,提问作者codingnoobs
相关产品推荐
相关产品推荐

