我自学自我教学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;
}
}
8/6 = 1.333333 ...不是1
答案 0 :(得分:2)
您正在执行整数除法,因此8/6 1.如果您想要浮点运算,可以更改fn
,sn
和{{1}转到dvi
而不是float
,或者你可以简单地将一个或两个参数转换为float(或double)。
答案 1 :(得分:1)
由于十进制变量类型为int
,您将始终获得floor
的数字。
所有三个都应该是float
或double
类型。否则dvi
可以是此类型,并且在分割期间将fn
和sn
类型转换为相同类型(float / double)。
答案 2 :(得分:0)
分割整数时,得到整数值而不是十进制值。要解决您的问题,您可以声明它们float
或double
或投射操作。
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的两个变量(即fn
和sn
分开,在c ++中,当两个整数被分割时,无论将存储的变量的数据类型如何,最终结果总是四舍五入。
解决问题的最简单方法是将这些变量的声明更改为:
double fn, sn, dvi;
注意:我在这里使用double,因为它可以存储更精确的值,因为它有8个字节分配给它,而浮点数是4。
这是解决问题的最简单方法。或者,我们可以在代码的数学步骤中使用强制转换;在这种情况下,我们将变量声明为:
int fn, sn;
double dvi;
然后,在分割数字的步骤中,您可以执行以下操作:
dvi = (double)(fn/sn);
这叫做铸造;这里的编译器是&#34;强制&#34;将这种分裂的最终结果视为双重。在你的情况下它将起作用,因为你正在划分数字,但是,作为旁注,它不能在所有情况下完成(例如,你不能将字符串转换为浮点数)。如果您想了解有关投射的更多信息,请参阅以下链接:
第三种方式,比铸造更简单的方法是:
dvi = (fn/sn)*1.0;
仅当dvi的类型为float或double时才能执行此操作。这里,数学运算涉及浮点数,因此所有值都不是 int 类型。因此,值的精度用小数点保存,在您的情况下,它将存储1.33333333333 ...而不是1.
很抱歉迟到的回复,我昨天没有时间回答你的问题。