Python Decimal-проверка целочисленности
я использую десятичную библиотеку в Python и распечатываю значения, используя
format(value, 'f')
, где значение a Decimal
. Я получаю номера в форме 10.00000
, который отражает точность в десятичных. Я знаю это float
поддерживает is_integer
, но, похоже, отсутствует аналогичный API для десятичных знаков. Мне было интересно, есть ли способ обойти это.
4 ответов
вы можете использовать операцию по модулю, чтобы проверить, есть ли нецелочисленный остаток:
>>> from decimal import Decimal
>>> Decimal('3.14') % 1 == 0
False
>>> Decimal('3') % 1 == 0
True
>>> Decimal('3.0') % 1 == 0
True
Decimal имеет "скрытый" метод под названием _isinteger (), который работает как метод is_integer () float:
>>> Decimal(1)._isinteger()
True
>>> Decimal(1.1)._isinteger()
Traceback (most recent call last):
File "C:\Program Files (x86)\Wing IDE 4.1\src\debug\tserver\_sandbox.py", line 1, in <module>
# Used internally for debug sandbox under external interpreter
File "C:\Python26\Lib\decimal.py", line 649, in __new__
"First convert the float to a string")
TypeError: Cannot convert float to Decimal. First convert the float to a string
Как вы можете видеть, вам придется поймать исключение. Кроме того, вы можете выполнить тест значения перед передачей его в Decimal с помощью метода float, как вы упомянули, или с помощью isinstance.
математическое решение состоит в том, чтобы преобразовать десятичное число в целое, а затем проверить его равенство с вашим числом.
С Decimal
может иметь произвольную точность, вы не должны преобразовать его в int
или float
.
к счастью,Decimal
класс to_integral_value
которые делают преобразование для вас. Вы можете принять такое решение:
def is_integer(d):
return d == d.to_integral_value()
пример:
from decimal import Decimal
d_int = Decimal(3)
assert is_integer(d_int)
d_float = Decimal(3.1415)
assert not is_integer(d_float)
посмотреть: http://docs.python.org/2/library/decimal.html#decimal.Decimal.to_integral_value