我试图用 C++ 制作一个 output/input 计算器

I was trying to make an output/input calculator with C++

我正在自学我自学 C++

但我在制作一个简单的 input/output 计算器时遇到了麻烦。

这是我想出的:

#include <iostream>

using namespace std;

int main()
{
    cout << "THIS IS TEST CALCULATOR!" << endl;

    int fn,sn,dvi;                                        //fn- FIRST NUMBER, sn - SECOND NUMBER
    cout << "Please type in the first number: " << endl;
    cin >> fn;


    cout << "Please type in the second number: " << endl;
    cin >> sn;


    cout << "Please choose type ( type in one: division, multiplication, subtraction, addition or modulus): "<< endl;   //Asks for the type on calculation; needs to type in one.
    std::string tp;
    cin>>tp;


    dvi = (fn/sn); // division

    if (tp == "division"){
        cout<<fn<<" divide by "<<sn<<" is "<<dvi<< endl;
    }
}

结果:

8/6 = 1.333333...不是 1

由于贴标的变量类型是int,你总是会得到数字的floor

这三个都应该是 floatdouble 类型。否则 dvi 可以是这种类型,并在除法期间将 fnsn 类型转换为相同类型 (float/double)。

您正在执行整数除法,因此 8/6 1. 如果您想要浮点运算,您可以更改 fn,sndvifloat 而不是 int,或者您可以简单地将一个或两个参数转换为浮点数(或双精度数)。

See this question for more in-depth answers.

整数相除时得到整数值而不是小数。要解决您的问题,您可以声明它们 floatdouble 或执行操作。

double dvi = ((double)fn / (double)sn); // division

不应将 fn、sn、dvi 声明为整数,而应将它们声明为双精度数:

double fn,sn,dvi; 否则,在 C++ 中将整数除以整数会将数字截断为更小的整数。例如:5/3 等于 1,尽管实际上它等于 1.6667。 C++ 不会四舍五入到 2.0,它会四舍五入到 1。

如果您不使用变量,此问题的另一个解决方法是将小数加到整数上,以便编译器将它们识别为双精度数。例如:5.0/2.0 = 2.5

您的代码中的问题是您将 2 个 int 类型的变量相除,并将其存储在一个 also int 类型的变量中。所有三个变量:

fn

sn

dvi

在您的代码中是 int 类型。 int 变量仅存储整数,范围从正无穷大到负无穷大。这意味着当您除以 2 个不产生整数的数字时,浮点值将被四舍五入,以便它可以存储在 int 变量中,在您的例子中是 dvi。另外,即使 dvi 单独是 float 数据类型,你的除法仍然会舍入到整数,因为你划分了两个数据类型 int 的变量,即 fnsn,而在 C++ 中,当两个整数相除时,无论将要存储的变量的数据类型如何,最终结果总是四舍五入。

解决该问题的最简单方法是将这些变量的声明更改为:

double fn, sn, dvi;

注意:我在这里使用 double,因为它可以存储更精确的值,因为它分配了 8 个字节,而 float 分配了 4 个字节。

这是解决您的问题的最简单方法。或者,我们可以在您代码的数学步骤中使用强制转换;在这种情况下,我们会将变量声明为:

int fn, sn;
double dvi;

然后在除数的步骤中,可以进行如下操作:

dvi = (double)(fn/sn);

这叫做铸造;此处的编译器“被迫”将此除法的最终结果视为双精度数。在您的情况下,它会起作用,因为您正在划分数字,但是,作为旁注,它不能在所有情况下都完成(例如,您不能将字符串转换为浮点数)。如果您想了解有关铸造的更多信息,请点击此处 link:

Typecasting in C and C++

第三种方法,比转换更简单的是执行以下操作:

dvi = (fn/sn)*1.0;

只有当 dvi 是 float 或 double 类型时才能这样做。在这里,数学运算涉及到一个浮点数,因此所有值都不是 int 类型。结果,该值的精度保留了小数点,在您的情况下,它将存储 1.33333333333... 而不是 1.

抱歉回复晚了,昨天我没来得及回答你的问题。