Here是问题的链接这是相对容易看的问题与简单的逻辑,使自己的计算器。输入两个数字,并将这四个数字('+','-','*','/')中的任何一个字符化,然后输出答案。
所以我把代码写成这样:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float a, b, d;
char c;
cin>>a>>b;
cin>>c;
if(c=='+') cout<<a+b;
if(c=='-') cout<<a-b;
if(c=='*') cout<<a*b;
if(c=='/') cout<<setprecision(10)<<(float)a/b;
return 0;
}
但它没能通过所有测试用例。我调整了一下代码行的划分和查找其他人的提交,并找到正确的答案作为
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float a, b, d;
char c;
cin>>a>>b;
cin>>c;
if(c=='+') cout<<a+b;
if(c=='-') cout<<a-b;
if(c=='*') cout<<a*b;
if(c=='/') cout<<setprecision(10)<<1.0*a/b; //here is the change
return 0;
}
所以我不能理解什么样的输入会给上面的两个代码带来不同的输出
这两条线的区别:
if(c=='/') cout<<setprecision(10)<<(float)a/b;
if(c=='/') cout<<setprecision(10)<<1.0*a/b;
3条答案
按热度按时间nkoocmlb1#
主要区别是
1.0*a/b
创建一个double(因为1.0
是double),而(float)a/b
创建一个精度较低的float
。你也可以使用
std::numeric_limits<T>::digits10
来知道你需要多少个十进制的数字来表示一个数字而不会丢失。您会注意到,对于float
和double
,您有:std::numeric_limits<float>::digits10 == 6
小于您要求的精度(10)std::numeric_limits<double>::digits10 == 15
,超过您所需的精度(10)有关精度的更多信息,您可以检查cppreference。
c90pui9n2#
区别在于:
(float) a / b
将a
转换为float
,并在a
和b
之间执行除法。这实际上是不必要的,因为a
和b
已经被声明为float
,所以您也可以编写为a / b
1.0 * a / b
是将a
乘以1.0
,而1.0
是double
文字。这意味着a
和b
都将在除法之前转换为双精度类型,除法的结果也将具有双精度。后一个表达式也可以写成
(double) a / b
。如果double
是IEEE-754浮点数,则与1.0
相乘是无操作,即一个什么都不做的手术与1.0
相乘的唯一效果是,如果另一边是float
,则转换为double
。另一种解决方案是将所有变量声明为
double
:如果您需要更高的精度,通常最好在任何地方使用相同级别的精度,而不仅仅是一次操作。
xzv2uavs3#
在你的原始程序中这些表达式
和
是等效的,因为两个表达式的类型都是
float
,这是由于操作数的类型。这个表情
由于
double
类型的常数1.0
,因此具有double
类型。因此,结果更加精确。尝试以下演示程序。
它的输出可能看起来像
正如您所看到的,
double
类型的对象可以用更多的数字更准确地表示。你可以这样写
或
得到同样的结果。或者,您可以在一开始将变量声明为
double
类型。您还需要在执行计算之前检查变量
b
是否不等于零。请注意,在这两个程序中,变量
d
没有使用,可能会被删除。