【问题标题】:C++ - Simple shape area calculator returns erroneous calculationsC++ - 简单形状面积计算器返回错误计算
【发布时间】:2013-09-27 05:57:33
【问题描述】:
#include <iostream>
#include <iomanip>
using namespace std;

class Rectangle 
{
float x, y;
public:
void value (float,float);
float area () {return (x*y);}
};

void Rectangle::value (float a,float b) 
{
x = a;
y = b;
}

class Circle 
{
float x;
public:
void value (float);
float area () {return (3.14*x*x);}
};

void Circle::value (float a) 
{
x = a;
}

int main () 
{
float q,a,b;
char reply;

cout << "\t\tArea Calculator";
do
{
cout << "\n\nPlease select from the following: ";
cout << "\n1. Rectangle";
cout << "\n2. Cirlce";
cout << "\n3. Exit";
cout << "\n\n";
cin >> q;
if (q==3)
break;

if (q==1)
{
system("cls");
Rectangle rect;
cout << "\nPlease enter length: ";
cin >> a;
cout << "\nPlease enter width: ";
cin >> b;
cout << "\nArea: " << rect.area();
cin.get();
cout << "\n\nDo you want to continue y/n: ";
cin >> reply;

    if (toupper(reply) == 'N') 
        {
        cout << "\n\n";
        cout << "Goodbye!";
        break;
        }
}

if (q==2)
{
system("cls");
Circle circ;
cout << "\nPlease enter radius: ";
cin >> a;
cout << "\nArea: " << circ.area();
cin.get();
cout << "\n\nDo you want to continue y/n: ";
cin >> reply;

    if (toupper(reply) == 'N') 
        {
        cout << "\n\n";
        cout << "Goodbye!";
        break;
        }
} 

}   while (toupper(reply!='Y'));
{
cout << "\n\n";
system("pause");
}
}

上面的代码,调试时出现以下警告:

“警告 C4244:'return':从 double 转换为 float,可能丢失数据”

...我很确定这是代码运行时计算错误的原因(例如,它返回 5x5 正方形的面积为 1.15292e+016) - 请任何人解释正确的方法解决这个问题,我似乎无法解决这个问题:(

【问题讨论】:

    标签: c++ calculator area


    【解决方案1】:

    错误的结果不是 double 到 float 转换的结果,而是未初始化 Rectangle/Circle 对象的维度成员的结果。 您需要在读取用户的值后调用 rect.value(a,b) 。 不这样做会使对象的 x 和 y 成员未初始化,因此包含一些任意值 - 导致计算结果错误。 为圆调用 circ.value(a) 也是如此。

    cout << "\nPlease enter length: ";
    cin >> a;
    cout << "\nPlease enter width: ";
    cin >> b;
    rect.value(a,b);
    cout << "\nArea: " << rect.area();
    

    double 到 float 转换的警告可能是“cin >> b”样式行的结果。 cin 流 >> 运算符处理读取双精度,而不是浮点数。 当您尝试将 cin 读入浮点数时,首先会得到一个双精度值,然后将其隐式转换为浮点数。由于 float 的精度低于 double,因此编译器会警告您这样做可能会丢失精度。假设浮点精度就足够了——这没有问题。您可以通过将类和变量声明为使用 double 而不是 float 来解决此问题。

    【讨论】:

    • 非常感谢! :D ...只是一个快速的后续问题,如果您不介意...如果 double 具有更高(双)精度,为什么不一直使用 double 代替 float - 是因为它使用更多内存可能? - 当然,如果是这样的话,考虑到现代计算机拥有的大量内存资源,这个数量可以忽略不计?
    • 当您要保留大量数字或要使用非常小的内存区域时,可能需要考虑内存。不要只考虑拥有 X GB RAM 的 PC - 考虑运行一些固件代码的微芯片,其中所需的内存大小会影响芯片大小 - 因此微芯片的价格。另一个潜在的考虑因素是在旧 CPU 或低端 CPU 上运行时,这些 CPU 可能没有“廉价”支持更高的精度,因此使用 float 比使用 double 更快。
    【解决方案2】:

    你没有初始化类的数据成员

    rect.area();circ.area(); 正在计算一些垃圾值的面积

    使用构造函数:

    Rectangle(float a, float b):x(a),y(b){}

    Circle(float a):x(a){}

    然后

    cin >> a;
    cin >> b;
    Rectangle rect(a,b);
    rect.area();
    

    cin >> a;
    Circle circ(a);
    circ.area();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2013-08-12
      相关资源
      最近更新 更多