【问题标题】:Determining whether an value is a whole number in Python在 Python 中判断一个值是否为整数
【发布时间】:2011-06-04 23:17:37
【问题描述】:

我想确定 Python 中的数值是否为整数。例如,给定:

y = x / 3

我想区分 x 的值,哪些值可以被 3 整除,哪些不是。

【问题讨论】:

  • 在这种情况下,小数是什么意思?整数是整数。它始终是一个整数。不知何故,你想检查一个整数是否有疾病:这个整数有小数,我们必须把它带到医院! ;)
  • 在这种情况下,“小数”是什么意思?小数点?整数永远不会有它们(带小数点的数字被解析为浮点数)。
  • 根据定义,整数没有小数。多田!你完成了!
  • 我知道“整数”的意思是“数字”,而“小数”的意思是“小数部分”,所以我相信 interjay 的答案是正确的。
  • 接受的答案不回答标题。我通过谷歌来到这里试图回答标题问题。由于发布者接受了与标题不同的答案,我们可以/应该编辑标题吗?见related meta post。注意:如果标题是固定的,这将成为 this 的重复问题。

标签: python python-2.x


【解决方案1】:

整数没有小数。如果你的意思是“检查 a number 在 Python 中是否有小数”,你可以这样做:

not float(your_number).is_integer()

【讨论】:

【解决方案2】:
if x % 3 == 0:
    print 'x is divisible by 3'

【讨论】:

  • @lev 在这里回答问题的一部分是理解 OP 的实际意思。阅读的不仅仅是问题的标题。很明显,OP 想知道如何判断一个数字是否可以被另一个整除。通过检查除法的结果是否为整数来做到这一点是非pythonic且容易出错的。
  • 重要:这不会检查数字是否为小数,因为标题和部分问题会建议您提出要求。例如,如果您有 x == 0.3,上面的代码将打印“x 可被 3 整除”,但 x 不是整数。请参阅 Artur Gaspar 答案以检查数字是否为小数。 @interjay 这应该可以。
  • 目前代码只有一个问题。在 Python 中,您应该在要打印的内容周围加上括号。所以代码的打印位应该是print ('x is divisible by 3')。如果没有,您仍然会收到错误消息。
  • 看起来提问的用户最初没有指定他/她正在使用的版本,也没有出现在问题的 cmets 关于与 Python 2 或 3 相关的讨论中。我做了一个建议的编辑关于添加类别 Python 2 进行说明。
  • @Boris 提问者想知道如何判断一个数是否可​​以被另一个数整除。这个答案与任何有相同问题的人有关。问题的标题提出了不同的问题,这是XY problem 的一个实例。由于浮点数不准确,从字面上回答这个问题会适得其反。事实上,在许多情况下,使用另一个答案的float(your_number).is_integer() 来确定整除性会导致不正确的结果。请在批评答案之前阅读整个问题,而不仅仅是标题。
【解决方案3】:

编辑:正如 Ollie 在这篇文章下方的评论中指出的那样,is_integer 是标准库的一部分,因此不应像我在下面所做的那样重新实现。

这个函数使用了这样一个事实,即每隔一个整数将至少有一个数可以被 2 整除且没有余数。 nn+1 中的任何非零小数表示将导致 n%2(n+1)%2 都有余数。这样做的好处是表示为浮点值的整数将返回 True。 该功能适用​​于正 据我所知,负数和零。正如函数中提到的,对于非常接近整数的值,它会失败。

def isInteger(n):
    """Return True if argument is a whole number, False if argument has a fractional part.

    Note that for values very close to an integer, this test breaks. During
    superficial testing the closest value to zero that evaluated correctly
    was 9.88131291682e-324. When dividing this number by 10, Python 2.7.1 evaluated
    the result to zero"""

    if n%2 == 0 or (n+1)%2 == 0:
        return True
    return False

【讨论】:

【解决方案4】:

如果x / 3 是一个整数,x % 3 == 0 将是True

【讨论】:

    【解决方案5】:

    这是另一种方法:

    x = 1/3  # insert your number here
    print(x - int(x) == 0)  # True if x is a whole number, False if it has decimals.
    

    这是有效的,因为 int(x) 基本上占据了数字的底数(例如 3.6453 -> 3)。如果减去底数后还有剩余,则它不可能是整数。

    【讨论】:

      【解决方案6】:

      假设您的意思是如果包含数字的字符串也有小数点:

      Python 2.6.6 (r266:84292, Apr 20 2011, 11:58:30) 
      [GCC 4.5.2] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> number='123.4'
      >>> '.' in number
      True
      >>> number='123'
      >>> '.' in number
      False
      >>>
      

      要测试它是否是完整的,你可以修改 1:

      >>> 1.0/3 % 1
      0.33333333333333331
      >>> 1/3 % 1
      0
      

      【讨论】:

        【解决方案7】:

        在 Python 2 中,将 int 除以 int 返回一个 int(除非使用 -Qnew 选项调用 python,或者 from __future__ import division 位于源代码的开头;在这种情况下,/ 返回一个浮点数); // 指定整数除法。

        在 Python 3 中,如果使用“/”,则将 int 除以 int 返回一个浮点数,如果使用“//”,则返回一个 int。

        如果您想知道一个 int 是否会准确地划分为另一个 int,请使用“%”查找余数。

        【讨论】:

          【解决方案8】:

          转换 1.0 => 1 & 转换 1.x => 1.x

          如果浮点数具有像 1.5 这样的小数部分,则此代码将返回 1.5 & 如果是 35.00,则返回 35:

          a = ReadFrom()    
          if float(a).is_integer(): # it is an integer number like 23.00 so return 23
                 return int(a)
           else: # for numbers with decimal part like : 1.5 return 1.5
                 return float(a)
          

          【讨论】:

            【解决方案9】:

            最好在进行除法之前做出决定,假设您的 x 变量是一个整数。

            尝试对浮点数进行相等性测试或比较是危险的:http://www.lahey.com/float.htm

            在进行除法之前已经使用模数提供了答案,以查看一个整数是否可以被另一个整数整除是安全的。在您进行除法并处理可能的浮点值之后,数字不再是整数。

            【讨论】:

              猜你喜欢
              • 2013-11-05
              • 2014-01-04
              • 2013-09-29
              • 2011-05-24
              • 1970-01-01
              • 2019-03-20
              • 1970-01-01
              相关资源
              最近更新 更多