我试图用C ++制作输出/输入计算器

时间:2017-02-11 18:56:48

标签: c++ calculator

我自学自我教学C ++

但是我在制作一个简单的输入/输出计算器时遇到了麻烦。

以下是我的想法:

#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;
    }
}

结果: enter image description here

8/6 = 1.333333 ...不是1

5 个答案:

答案 0 :(得分:2)

您正在执行整数除法,因此8/6 1.如果您想要浮点运算,可以更改fnsn和{{1}转到dvi而不是float,或者你可以简单地将一个或两个参数转换为float(或double)。

See this question for more in-depth answers

答案 1 :(得分:1)

由于十进制变量类型为int,您将始终获得floor的数字。

所有三个都应该是floatdouble类型。否则dvi可以是此类型,并且在分割期间将fnsn类型转换为相同类型(float / double)。

答案 2 :(得分:0)

分割整数时,得到整数值而不是十进制值。要解决您的问题,您可以声明它们floatdouble或投射操作。

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

答案 3 :(得分:0)

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

double fn,sn,dvi; 否则,在C ++中用整数除整数将把数字截断为一个较小的整数。例如:5/3等于1,即使实际上它等于1.6667。 C ++不会向上舍入到2.0,它将向下舍入为1.

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

答案 4 :(得分:0)

您的代码中的问题是您要划分2个int类型的变量,并将其存储在类型为int的 的变量中。所有三个变量:

  

FN

     

SN

     

DVI

在代码中的类型为int。 int变量仅存储整数,范围从正无穷大到负无穷大。这意味着当您划分2个不产生整数的数字时,浮点值将四舍五入,以便它可以存储在int变量中,在您的情况下为dvi。此外,即使dvi仅为数据类型float,您的除法仍将舍入为整数,因为您已将数据类型为int的两个变量(即fnsn分开,在c ++中,当两个整数被分割时,无论将存储的变量的数据类型如何,最终结果总是四舍五入。

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

double fn, sn, dvi;

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

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

int fn, sn;
double dvi;

然后,在分割数字的步骤中,您可以执行以下操作:

dvi = (double)(fn/sn);

这叫做铸造;这里的编译器是&#34;强制&#34;将这种分裂的最终结果视为双重。在你的情况下它将起作用,因为你正在划分数字,但是,作为旁注,它不能在所有情况下完成(例如,你不能将字符串转换为浮点数)。如果您想了解有关投射的更多信息,请参阅以下链接:

Typecasting in C and C++

第三种方式,比铸造更简单的方法是:

dvi = (fn/sn)*1.0;

仅当dvi的类型为float或double时才能执行此操作。这里,数学运算涉及浮点数,因此所有值都不是 int 类型。因此,值的精度用小数点保存,在您的情况下,它将存储1.33333333333 ...而不是1.

很抱歉迟到的回复,我昨天没有时间回答你的问题。