c++ - 在没有任何库的情况下测试数字是否具有十进制值

标签 c++

<分区>

我需要在 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)

还有一种不正确的方式:

  • 对于目标类型范围之外的数字,转换为整数类型将失败(具有未定义的行为!),因此这不适合验证不受信任的输入(如果输入是可信的,为什么需要验证?)

A prvalue of a floating point type can be converted to a prvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type.

关于c++ - 在没有任何库的情况下测试数字是否具有十进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30135668/

相关文章:

c++ - 初始化列表之前的对象初始化

c++ - $include 在 C++ 文件中,以及代码中的其他 $ 值

C++:参数传递 "passed by reference"

c++ - 从 std::vector<std::vector<T>> 中删除任意项目列表

c++ - 变量作为全局范围内的结构 - 如何定义?

c++ - 当值为指针时尝试读取或写入 protected 内存

c++ - 当在另一个线程上完成工作时,有没有办法保护智能指针不在一个线程上被释放?

c++ - 如何为显式重载构造函数启用复制初始化?

c++ - OpenGL:为什么我的相机上下颠倒?

c++ - 依赖模板可以使用 Visual Studio 编译,但使用 clang/gcc 失败