web-dev-qa-db-ja.com

float値が整数かどうかを調べる方法

私は整数である最大の立方根を見つけようとしています、それは12,000未満です。

processing = True
n = 12000
while processing:
    n -= 1
    if n ** (1/3) == #checks to see if this has decimals or not

整数かどうかを確認する方法がわかりません。私はそれを文字列に変換し、それからインデックスを使って終了値をチェックし、それらがゼロかどうかを確かめることができますが、それはかなり面倒です。もっと簡単な方法はありますか?

154

Float値が整数かどうかを調べるには、 float.is_integer()メソッド を使用します。

>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False

このメソッドはPython 2.6でfloat型に追加されました。

Python 2では、1/30(整数オペランドのフロア分割!)であり、浮動小数点演算は不正確である可能性があることを考慮してください(floatは2進小数を使用する近似です、not正確な実数)しかし、ループを少し調整すると、次のようになります。

>>> for n in range(12000, -1, -1):
...     if (n ** (1.0/3)).is_integer():
...         print n
... 
27
8
1
0

これは、前述の不正確さのために、3キューブ以上のもの(10648を含む)が見逃されたことを意味します。

>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996

代わりに整数を整数全体に近いチェックする必要があります。そうでない場合は、float()を使用して番号を見つける必要はありません。 12000の立方根を切り捨てるのと同じです。

>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648

Python 3.5以降を使用している場合は、 math.isclose()関数 を使用して、浮動小数点値が設定可能なマージン内にあるかどうかを確認できます。

>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True

古いバージョンでは、その関数の単純な実装(エラーチェックをスキップし、無限大とNaNを無視する) PEP485で述べられているように

def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
    return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
290
Martijn Pieters

モジュロ(%)演算子を使用できます。これは、xをyで割ったときに残っている余りの数を示します - x % yとして表します。整数はすべて1で除算しなければならないため、余りがある場合は整数にしないでください。

この関数は、Trueが整数かどうかに応じて、ブール値Falseまたはnを返します。

def is_whole(n):
    return n % 1 == 0
24
MagikCow

あなたはこれを使用することができます:

if k == int(k):
    print(str(k) + " is a whole number!")
12
Juri Robl

あなたはループしたり何かをチェックする必要はありません。ちょうど12000の立方根を取り、それを切り捨てます。

r = int(12000**(1/3.0))
print r*r*r # 10648
8
georg

そのためには モジュロ 演算を使用できます。

if (n ** (1.0/3)) % 1 != 0:
    print("We have a decimal number here!")
7
Jakub Jirutka

立方根をテストするほうが簡単ではないでしょうか。 20(20 ** 3 = 8000)から始めて30(30 ** 3 = 27000)まで上がります。それからあなたは10未満の整数をテストしなければなりません。

for i in range(20, 30):
    print("Trying {0}".format(i))
    if i ** 3 > 12000:
        print("Maximum integral cube root less than 12000: {0}".format(i - 1))
        break
6
hughdbrown

上記の答えは多くの場合にうまくいきますが、いくつか見逃しています。次の点を考慮してください。

fl = sum([0.1]*10)  # this is 0.9999999999999999, but we want to say it IS an int

ベンチマークとしてこれを使用して、他の提案のいくつかは私達が望むかもしれない行動を得ません:

fl.is_integer() # False

fl % 1 == 0     # False

代わりに試してみてください。

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

def is_integer(fl):
    return isclose(fl, round(fl))

今我々は得ます:

is_integer(fl)   # True

iscloseには Python 3.5 + が付属しています。他のPythonでは、これとほぼ同等の定義を使用できます(対応する PEP を参照)。

3
control_fd

どうですか?

if x%1==0:
    print "is integer"
3
Daniel

ちょっとした補足情報、is_integerは内部的にやっていることです。

import math
isInteger = (math.floor(x) == x)

厳密にはpythonではなく、cpythonの実装は上記のように実装されています。

1
user1767754

値を計算するには、 round 関数を使用できます。

私たちが立方根の値を計算するときに多くの人が指摘したように、Pythonではそうです、それはあなたに少しのエラーであなたに出力を与えるでしょう。値が整数かどうかを確認するには、次の関数を使います。

def cube_integer(n):
    if round(n**(1.0/3.0))**3 == n:
        return True
    return False

しかし、 int(n)math.floor と等価です。 345ではなく344になるint(41063625**(1.0/3.0))を見つけてください。

そのため、キューブルートでintを使用するときは注意してください。

あなたの質問に答えてください。他に質問がある場合は、 私に連絡してください

0
Anivarth