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.


попробовать math.floor(val) == val или val == int(val).


математическое решение состоит в том, чтобы преобразовать десятичное число в целое, а затем проверить его равенство с вашим числом.

С 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