Is_Integer返回错误的结果 - Python 2.X

时间:2017-06-07 20:07:04

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

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。是什么给了什么?

3 个答案:

答案 0 :(得分:1)

由于浮点不精确,

SN 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

更新:如何处理&#34;非常接近&#34;

有关处理几乎相等的代码,请参阅here。一般方法是设置容差并使用如下内容:

if abs(a-b) <= tolerance:

或者,&#34;差异太小而不重要?&#34;

答案 1 :(得分:1)

如果需要更精确的十进制算术,请使用十进制模块。小数没有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

答案 2 :(得分:0)

来自docs&#34;如果float实例是有限的整数值,则返回True,否则返回False;#34;。只有小数位的零才能使它以整数形式返回true。