Soru Float değerinin tam sayı olup olmadığını nasıl kontrol edilir


Tam sayı olan en büyük küp kökü bulmaya çalışıyorum, bu 12.000'den az.

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

Tam sayı olup olmadığını nasıl kontrol edeceğimi bilmiyorum ya da değil! Onu bir dizgeye dönüştürebilirim, sonra bitiş değerlerini kontrol etmek için indekslemeyi kullanabilirim ve sıfır olup olmadıklarına bakıp, oldukça hantal görünüyorlar. Daha basit bir yolu var mı?


113
2018-02-05 17:06


Menşei


küp kökünden çalışmayı kolaylaştırır n -> (n * n * n <12000) - suspectus


Cevaplar:


Float değerinin tam sayı olup olmadığını kontrol etmek için float.is_integer() yöntem:

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

Yöntem eklenmiştir float Python 2.6 yazın.

Python 2'de şunu göz önünde bulundurun. 1/3 olduğu 0 (tamsayı işlenenleri için kat bölme!) ve bu kayan nokta aritmetiği kesin olmayabilir (a float ikili kesirler kullanarak bir yaklaşımdır, değil kesin bir gerçek sayı). Ama döngüsünü biraz ayarlayarak şunu verir:

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

Bu da, daha önce zikredilen üç yüzdelik (10648 dahil) herhangi bir şeyin kaçırılmaması anlamına gelir:

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

Sayıları kontrol etmelisin kapat yerine tüm sayıya veya kullanmayın float() Numaranı bulmak için Küpün kökünü yuvarlamak gibi 12000:

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

Python 3.5 veya daha yeni kullanıyorsanız, math.isclose() fonksiyon Kayan nokta değerinin yapılandırılabilir bir kenar boşluğu içinde olup olmadığını görmek için:

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

Daha eski sürümler için, bu işlevin saf uygulanması (hata kontrolünün atlanması ve sonsuzluğun ve NaN'nin göz ardı edilmesi) PEP485'te belirtildiği gibi:

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)

219
2018-02-05 17:09



Python'u bilmemek, bu tür bir ifade beni gerçek dünyada çalışmak için mükemmel bir matematik gerektirdiği için beni sinirlendirirdi. - Peter M
@PeterM: Bu yöntem gerçekten sadece döndürür True hiç ondalık yok ise. Elbette OP'nin kayan nokta aritmetiği ve kesinliği hakkında bir yanlış anlaşılma olabilir. - Martijn Pieters♦
@MartijnPieters Evet ve bir kayan nokta hesaplamasındaki küçük bir kayma ve aniden, 0.00000000000000000001 gibi bu küçük, istenmeyen ondalıklar var - Peter M
@PeterM: ve varsayılan sunum 16 basamağa yuvarlanır; 1.0000000000000001 olarak görüntülenir 1.0. - Martijn Pieters♦
@ AllDani.com: Ne sorduğundan emin değilim. 1.1 ondalık kısmı 0 değil, bir tam sayı değil. - Martijn Pieters♦


Modulo (%) operatörünü kullanabiliriz. Bu bize x 'yi bölersek kaç tane kalıntımız olduğunu anlatır - x % y. Her sayının 1'e bölünmesi gerekir, bu yüzden bir kalan varsa, tam sayı olmamalıdır.

Bu işlev bir boole döndürecektir. True veya False, bağlı olup olmamasına göre n tam bir sayıdır.

def is_whole(n):
    if n % 1 == 0:
        return True
    else:
        return False

12
2017-08-30 13:56



Temellere gitmeyi seviyorum. Yapabilirsin return n % 1 == 0 bazı satırları kaydetmek. - antorqs


Bunu kullanabilirsin:

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

11
2018-02-05 17:09



bunun için başarısız büyük sayılar süre .is_integer() çalışmaya devam ediyor. - jfs
IMHO bağlantınız işe yaramadığını göstermiyor. Sadece büyük şamandıraların hassaslığını yitirdiğini gösteriyor. is_integer benzer bir yöntem kullanıro = (floor(x) == x) ? Py_True : Py_False;). Ama kabul ediyorum, biri kullanmalı is_integer() daha açık olduğu gibi. - Juri Robl
Evet. Sadece büyük yüzdürmenin hassaslığını kaybedebileceğini gösterir, large_float == large_int bile olsa başarısız olabilir large_float == float(large_int). - jfs
123456789012345678901234567890.0 != 123456789012345678901234567890 fakat 123456789012345678901234567890.0 == float(123456789012345678901234567890) - jfs
Evet ama k = 123456789012345678901234567890.0 sonra k == int(k) Doğru, doğru cevap budur. - Juri Robl


Kullanabilirsiniz modülo Bunun için operasyon.

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

6
2018-02-05 17:10



Eğer n 6.2, 6.0, 6.12312412, hepimiz var "We have a decimal number here!"? - Jay Wong


Dönmeniz veya herhangi bir şeyi kontrol etmeniz gerekmez. Sadece 12.000'lik bir küp kökü alın ve aşağı doğru yuvarlaklaştırın:

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

6
2018-02-05 17:22



Bu makul bir cevaptır. - hughdbrown


Küp köklerini test etmek daha kolay olmaz mıydı? 20 (20 ** 3 = 8000) ile başlayın ve 30'a kadar çıkın (30 ** 3 = 27000). Daha sonra 10'dan az tamsayı test etmeniz gerekiyor.

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

5
2018-02-05 17:11



Üstelik, yüzerde yuvarlama hataları vardır, bu sayede hesaplanırken sayıları kaçırabilirsiniz. n**(1/3) tamsayıdır. Örneğin benim bilgisayarımda 10648 ** (1/3) = 21.999999999999996 `yerine 22: sorun! Bu cevapla, böyle bir problem yoktur. Bence bu, matematiksel bakış açısından tek çözüm (diğer çözümler Python-doğrudur). - JPG


Ne dersin

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

3
2018-01-14 08:56