Để kiểm tra xem giá trị float có phải là số nguyên hay không, hãy sử dụng float.is_integer()
phương thức :
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
Phương thức đã được thêm vào float
loại trong Python 2.6.
Hãy xem xét rằng trong Python 2, 1/3
là 0
(phép chia tầng cho toán hạng nguyên!) Và số học dấu phẩy động có thể không chính xác (a float
là một xấp xỉ sử dụng phân số nhị phân, không phải là số thực chính xác). Nhưng điều chỉnh vòng lặp của bạn một chút điều này mang lại:
>>> for n in range(12000, -1, -1):
... if (n ** (1.0/3)).is_integer():
... print n
...
27
8
1
0
điều đó có nghĩa là bất cứ thứ gì trên 3 khối, (bao gồm 10648) đã bị bỏ lỡ do sự thiếu chính xác đã nói ở trên:
>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996
Thay vào đó, bạn phải kiểm tra các số gần với toàn bộ số hoặc không sử dụng float()
để tìm số của mình. Giống như làm tròn xuống khối lập phương của 12000
:
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
Nếu bạn đang sử dụng Python 3.5 hoặc mới hơn, bạn có thể sử dụng math.isclose()
hàm để xem giá trị của dấu phẩy động có nằm trong lề có thể định cấu hình hay không:
>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True
Đối với các phiên bản cũ hơn, việc triển khai chức năng đó một cách ngây thơ (bỏ qua kiểm tra lỗi và bỏ qua vô cực và NaN) như được đề cập trong 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)