【问题标题】:Is_Integer returning incorrect result - Python 2.XIs_Integer 返回不正确的结果 - Python 2.X
【发布时间】:2017-06-07 20:07:04
【问题描述】:
dig = 16807
digcount = len(str(dig))
minroot = dig ** (1 / float(digcount))

print minroot
print minroot.is_integer()

minroot 返回 7.0 作为浮点数,但 is_integer 返回 FALSE

我试过(7.0).is_integer(),它返回TRUE。什么给了?

【问题讨论】:

  • printing 浮动时,Python 2 会更积极地进行循环。
  • minroot7.000000000000001 不是 7.0 使用 print repr(minroot) 来查看更好的表示值
  • @MooingRawr 哇,这是正确的......为什么它会那样做?答案应该是 7 偶数
  • @MooingRawr:严格来说,不是确切的值,而是足够的数字来区分该值与任何其他浮点数。
  • @Alex: minroot 不是整数。在实数算术中,它将是一个整数,但真正的实数算术是无法实现的。这是浮点数,一个近似值。

标签: python python-2.7 python-2.x


【解决方案1】:

S请注意,由于浮点不精确,minroot 不是精确 7.0。 is_integer 需要这种精度。这是您的代码,其中包含更多细节。

dig = 16807
digcount = len(str(dig))
minroot = dig ** (1 / float(digcount))

print repr(minroot)
print minroot.is_integer()
a = 7.0
print a, type(a)
print a.is_integer()

输出:

7.0000000000000009
False
7.0 <type 'float'>
True

更新:如何处理“非常接近”

请参阅here 以获取处理几乎相等的代码。一般的方法是设置一个容差并使用诸如:

if abs(a-b) <= tolerance:

或者,“差异是否太小而不重要?”

【讨论】:

  • 我明白了。您在实践中如何处理这个问题?我想检查 minroot 是否是我拥有的 IF 语句中的整数
  • is_integer 不是类型检查;这是一个价值检查。
  • @Alex:如果这样的属性对您很重要,那么浮点运算不适合您的用例。根据提供精确运算的类型(如整数)来制定程序,并考虑使用计算机代数系统,如 SymPy。
  • @user2357112;感谢您校对我的大脑。我正在修正答案。
【解决方案2】:

如果您想要更精确的十进制运算,请使用十进制模块。小数没有is_integer method,但您可以与 int 值进行比较。

>>> from decimal import Decimal as D
>>> 7**5
16807
>>> from decimal import Decimal as D
>>> n = D(16807)**(D(1)/D(5))
>>> n
Decimal('7.000000000000000000000000000')
>>> int(n)
7
>>> n == int(n)
True

为了表明测试做了你想要的:

>>> m = D('7.000000000000000000000000001')
>>> m == int(m)
False

【讨论】:

  • 这只是碰巧很好地解决了,因为 1/5 可以精确地用十进制表示。对于像 729^(1/6) 这样的东西,它再次失败。仅仅通过提高问题的精度或更改基数,您无法从不精确的算术中得到准确的结果。
  • 你是对的。 729**(1/6)用二进制浮点计算恰好等于int 3,而用十进制浮点计算则不是。
【解决方案3】:

来自文档“如果浮点实例是有限的整数值,则返回 True,否则返回 False”。只有小数位为零,才能以整数形式返回 true。

【讨论】:

    猜你喜欢
    • 2012-04-11
    • 2016-02-06
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2017-11-28
    相关资源
    最近更新 更多