测试一个数字是否具有小数值,而没有任何库

Testing if a number has a decimal value without any library

本文关键字:小数 任何库 是否 数字 一个 测试      更新时间:2023-10-16

我需要测试一个数字在C 中是否具有小数为小数。我只想使用<iostream>,没有其他库,但是我很好奇我使用的方法是否可以接受。如果您可以提供任何帮助,找到一种更好的方法。

#include <iostream>
int main() {
    double x, y;
    std::cin >> x;
    int z = x;
    if (x - z != 0) {
        std::cout << "It's a decimal.";
    }
    else {
        std::cout << "It's not a decimal.";
    }
    return 0;
}

考虑到更长的时间后,我想出了一个似乎可以接受的新功能。

double TestForDecimal(double Num) {
    double z;
    while (Num > 1) {
        if (Num > 101) /* Increments down to 1 more quickly */ {
        Num = Num - 100;
    }
        else if (Num > 12) { Num = Num - 10; }
        else { Num--; }
    }
    if (Num < 1 && Num > 0) {
        std::cout << "This number has a decimal value" << std::endl;
        return 1;
    }
    else {
        std::cout << "Theres no decimal" << std::endl;
        return 0;
    }
}

测试的两种"正确"方法:

  • std::fmod(x, 1.0)隔离分数。
  • 使用floorceiltrunc丢弃分数,例如测试x == std::floor(x)
  • 是否

和一种不正确的方式:

  • 铸造到积分类型将在目标类型范围之外的数字中失败(使用未定义的行为!),因此这不适用于验证不信任的输入(如果信任输入,为什么需要是验证?)

可以将流量点类型的prvalue转换为整数类型的prvalue。转换截断;也就是说,分数部分被丢弃。如果无法在目标类型中表示截短值,则行为是不确定的。

我认为您正在寻找这样的东西:

#include <iostream>
int main()
{
  double a;
  std::cin >> a;
  if(int(a) != a)
  {
      std::cout << "decimal";
  }
  else
  {
      std::cout << "no decimal";
  }
  return 0;
}