整数或双精度1.0和1

时间:2019-03-25 14:15:16

标签: c++

我想读取一个双精度数字并确定输入是Integer还是double。问题是当我输入1.00(是双精度)时,我得到的结果是整数

double a;
cin >> a;
if (a == int(a))
    cout << "Integer";
else
    cout << "Double";

3 个答案:

答案 0 :(得分:4)

您可以读入字符串并检查其是否包含小数点分隔符。假设它是“。”,这是一个示例实现:

#include <iostream>
#include <string>

int main()
{
  std::string s;
  std::cin >> s;
  std::cout << ((s.find('.') == std::string::npos) ? "integer" : "double") << std::endl;
  return 0;
}

您还必须检查指数(例如2e-1)。这是完成这一切的一种方法:

#include <iostream>
#include <string>

int main()
{
  std::string s;
  std::cin >> s;
  if (s.find_first_of(".,eE") == std::string::npos)
    std::cout << "integer" << std::endl;
  else
    std::cout << "double" << std::endl;
  return 0;
}

答案 1 :(得分:3)

在if语句中,您将a强制转换为int。这将截断十进制值。

1 == 1始终为1.0 == 1

我建议您看一下以下答案: How to validate numeric input C++

答案 2 :(得分:0)

也许std::variant是解决问题的一种优雅方法。 std::variant<int, double>可以存储intdouble。取决于您存储的内部类型将发生变化。

#include <variant>
#include <string>
#include <cassert>


bool isInt(const std::variant<int, double> &intOrDouble) {
    try {
      std::get<double>(intOrDouble); 
    }
    catch (const std::bad_variant_access&) {
        return false;
    }
    return true;
}

int main()
{
    std::variant<int, double> intOrDouble;
    intOrDouble = 12.0; // type will be double -> return will be 1
    //intOrDouble = 12; // type will be int    -> return will be 0

    return isInt(intOrDouble); 
}