Untuk memeriksa apakah nilai float adalah bilangan bulat, gunakan float.is_integer()
metode ini :
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
Metode ini ditambahkan ke float
tipe Python 2.6.
Mempertimbangkan bahwa dalam Python 2, 1/3
adalah 0
(pembagian lantai untuk operan bilangan bulat!), Dan bahwa aritmatika titik apung dapat tidak tepat (a float
adalah perkiraan menggunakan fraksi biner, bukan bilangan real yang tepat). Tetapi sedikit menyesuaikan loop Anda ini memberi:
>>> for n in range(12000, -1, -1):
... if (n ** (1.0/3)).is_integer():
... print n
...
27
8
1
0
yang berarti bahwa lebih dari 3 potong dadu, (termasuk 10648) terlewatkan karena ketidaktepatan yang disebutkan di atas:
>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996
Anda harus memeriksa nomor yang dekat dengan seluruh nomor, atau tidak menggunakan float()
untuk menemukan nomor Anda. Seperti membulatkan akar pangkat tiga dari 12000
:
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
Jika Anda menggunakan Python 3.5 atau yang lebih baru, Anda dapat menggunakan math.isclose()
fungsi ini untuk melihat apakah nilai floating point berada dalam margin yang dapat dikonfigurasi:
>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True
Untuk versi yang lebih lama, implementasi naif dari fungsi itu (melewatkan pemeriksaan kesalahan dan mengabaikan infinity dan NaN) sebagaimana disebutkan dalam 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)