【问题标题】:Checking if number is an integer in C/C++ (without scanf/gets/etc)检查数字是否是 C/C++ 中的整数(没有 scanf/gets/etc)
【发布时间】:2025-12-20 09:55:16
【问题描述】:

我正在尝试做的事情在 Python 中看起来像这样 (其中n 是浮点数/双精度数):

def check_int(n):
    if not isinstance(n, numbers.Integral):
        raise TypeError()

既然 C/C++ 是类型强的,那么哪种类型的转换和比较魔法最适合这个目的?

我最好想知道它是如何在 C 中完成的。

【问题讨论】:

  • 你想要 C 还是 C++?它们是非常不同的语言。你需要选择一个
  • 这没有多大意义。只有floatdoublelong double 不能是整数。其他一切都已经是整数了。如果你想检查一个浮点类型是否代表一个非常简单的整数,你只需确保它等于它的下限。
  • 那几乎不可能。并非每个“整数”数字在 float/double 中都有表示
  • 在 C++ 中,这将是一个编译时错误,因为它是一种静态类型语言。
  • 当 n 是浮点类型时,python 函数不会返回 false,即使它具有整数值?

标签: c++ c floating-point integer


【解决方案1】:

使用floor

#include <cmath>

if (floor(n) == n)
    // n is an integer (mathematically speaking)

【讨论】:

  • 虽然这可能是“数学上正确的”,但使用双重实现并不总是正确的 (here's an example)
  • @Daniel B 发布的 python 函数正在检查类型,而不是值。虽然,编程类型检查在 C 中是否有意义是另一个问题......
  • @scohe001 你的例子并没有真正说明 the 问题。更多的是为了展示 fp 操作的不精确性。
  • @EugeneSh。这正是问题所在。当甚至不是每个整数都可以表示时,您如何判断 fp 是否为整数?这个问题的唯一答案是框架挑战。
  • @scohe001 正如我所说,它不能像我的第一条评论中那样使用浮点常量。