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