【问题标题】:C++: Why is my if-else statement not working? [duplicate]C++:为什么我的 if-else 语句不起作用? [复制]
【发布时间】:2021-02-02 14:41:32
【问题描述】:

所以我有一个任务,我是编程新手。

我的教授想要一个输出,当我输入一个数字时,程序将得到该数字的平方根,然后如果答案是整数,它将 + 1,如果它是十进制数,它将为-1。但问题是,整数中的 if 正在加 1,但在十进制中,它仍然加 1。(抱歉英语不好)

例如我输入了25,25的平方根是5,所以在条件下,我应该加1来回答,所以它是6

如果我输入24,它的平方根是4.898979486,所以它应该是3.898979486,因为它是小数,程序应该是-1。

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    double num, result;
    cout << "Enter a number: \n";
    cin >> num;
    result = sqrt(num);
    if (num == 0) {
        cout << "\nThe number is in decimal number: " << --result;
    }
    else {
        cout << "\nThe number is in whole number: " << ++result;
    }
    return 0;
}

【问题讨论】:

  • if (num==0)如何检查num是一个整数?
  • 另外,听起来您需要一位不同的教授,他实际上不仅了解 C++,还了解计算机科学,并且了解为什么浮点数学会被破坏。
  • 猜猜这可能会有所帮助:stackoverflow.com/questions/1521607/…
  • 您好,欢迎您。除了上述解决方案建议之外,您能否使用缩进使您的代码更具可读性。非常感谢,祝你好运。
  • 不要比较浮点数是否相等!浮点变量可能无法完全符合您的预期,具体取决于架构。

标签: c++ if-statement


【解决方案1】:

if (num == 0) 显然不是判断num 是否为整数的正确方法。

他们说我应该使用if (num%==0),但% 不适用于floatdouble,因为它仅适用于int

您可以使用std::fmod,它对此类类型“有效”,但如 cmets 中所述,floating-point math is kind of broken 或更好,它的精度有限。因此,与其检查两个值是否相等,不如检查它们是否几乎相等。

您可以使用许多其他库函数来解决此任务,例如 std::modfstd::nearbyintstd::round 等等。参见例如Check double variable if it contains an integer, and not floating point

以下 sn-p 旨在测试可能的实现,仅供说明。

#include <iostream>
#include <iomanip>
#include <cmath>

bool is_almost_whole(double x, double eps)
{
    return std::min( x - std::floor(x), std::ceil(x) - x ) < eps;
}

int main()
{
    std::cout << std::boolalpha;
    for (double i{-1.0}; i < 2.1; i += 0.1)
    {
        std::cout << std::setprecision(35) << std::setw(45)
            << std::scientific << std::right << i 
            << "  " << std::setw(6) << std::left 
            << is_almost_whole(i, 0.001) << '\n';
    }
}

可测试here

【讨论】:

    【解决方案2】:

    您尝试检查十进制数的方式不正确。你可以试试这样的-

    if(num - (floor(result) * floor(result)) !=0 ){
        // result is a decimal number
    } 
    

    但是,有时这种方法会给出错误的答案。因为我们在这里合作 浮点数和精度误差始终是浮点数的事实。相反,您可以编写一个函数 - isSquareNumber(int n),它将决定结果是否为小数。

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    bool isSquareNumber(int n){
        int l=1, h=n;
        while(l<=h){
            int m = (l+h) / 2;
            if(m*m == n){
                return true;
            }else if(m*m > n){
                h = m-1;
            }else{
                l = m+1;
            }
        }
        return false;
    }
     
    int main(){
        double num, result;
        cout<<"Enter a number: \n";
        cin>>num;
        result=sqrt(num);
        if ( isSquareNumber(num) == false ){
            cout<<"\nThe number is in decimal number: "<<--result;
        }else{
            cout<<"\nThe number is in whole number: "<<++result;
        }
    return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2018-07-30
      相关资源
      最近更新 更多