if(abs(num-num2)<= 0.01)cout <<“ XYyx”;在c ++中不起作用

时间:2018-08-17 18:13:38

标签: c++ c++17

我是新手程序员。使用c ++控制台程序,我要计算两个数字是否几乎相等(这两个数字之间的差必须在 0.01 之间。当这两个数字相等时,该程序会给出正确的结果是 3 17.99 。但是当数字超出此范围时,它将不起作用。代码如下:-

double num,num2;
while(cin>>num>>num2)
{
    if(abs(num-num2)<=0.01)
    {
       cout<<"The numbers are almost equal";
    }
} 

我也尝试过这种方式:-

double num,num2;
while(cin>>num>>num2)
{
    if(num>num2)
    {
        if(num-num2<=0.01)
            cout<<"~";
    }
    else if(num2>num)
    {
        if(num2-num<=0.01)
            cout<<"~";
    }
} 

这两种方法都不起作用。我已经用(17.99,17.88),(12.34,12.35),(3.01,3.00),(18.00,17.99),(2.99,3.00)等进行了测试。正如我之前所说的,它仅适用于[3,18]范围内的那些数字。但是当我尝试使用此代码时:-

double num,num2;
while(cin>>num>>num2)
{
   if(num>num2)
   {
      if(num2+0.01>=num)
      {
         cout<<"~";
      }
   }
   else if(num2>num)
   {
      if(num+0.01>=num)
      {
         cout<<"~";
      }
   }
} 

有效。但是正如我们从数学上知道的:-

num-num2<=0.01  Or, -num2-0.01<=-num  Or, num2+0.01>=num 

,因此 num-num2 <= 0.01 的表达方式与 num2 + 0.01> = num 相同。在相同的方法中, num2-num <= 0.01 等效于 num + 0.01> = num2 。那么,为什么最后一种方法可行,而不是前两种方法可行?我只是找不到原因。所以,伙计,请帮帮我。帮助我知道为什么会这样吗?

请注意:-为了使程序正常运行,我已经声明了必须声明的内容。另外这句话:-

using namespace std; 

在以上所有代码中都使用。

1 个答案:

答案 0 :(得分:8)

好像您正在使用C中的abs(),并且从documentation可以看到,它接受类型为int的值,因此您的参数是四舍五入的。您可能需要从那里使用fabs()或更好的C ++变体std::abs()来提供适当的overloads

另一种情况告诉您“ using namespace std;不是您的朋友”