python十进制 - 检查是否为整数

Pra*_*yot 12 python format decimal

我在Python中使用Decimal库,并使用值打印出值 format(value, 'f'),其中value是a Decimal.我在表单中得到数字10.00000,这反映了小数的精度.我知道float 支持is_integer,但似乎缺少类似的小数组API.我想知道是否有办法解决这个问题.

pok*_*oke 24

您可以使用模运算来检查是否存在非整数余数:

>>> from decimal import Decimal
>>> Decimal('3.14') % 1 == 0
False
>>> Decimal('3') % 1 == 0
True
>>> Decimal('3.0') % 1 == 0
True
Run Code Online (Sandbox Code Playgroud)

  • 如果一个值太大,这个方法不起作用,它会给你`decimal.InvalidOperation://,%或divmod中的商太大了 (5认同)

Dav*_*ave 13

从 Python 3.6 开始,Decimal有一个方法as_integer_ratio().

as_integer_ratio()返回一个(分子,分母)元组。如果分母为 1,则该值为整数。

>>> from decimal import Decimal
>>> Decimal("123.456").as_integer_ratio()[1] == 1
False
>>> Decimal("123.000").as_integer_ratio()[1] == 1
True
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试math.floor(val) == valval == int(val)

  • “int”建议很好。`math.floor` 是一个糟糕的选择,因为它依赖于浮点数,而浮点数无法准确表示小数。你甚至必须导入一个模块才能得到这个不准确的结果。 (4认同)

Lau*_*RTE 5

数学解决方案是将十进制数字转换为整数,然后测试其与数字的相等性。

由于Decimal可以具有任意精度,因此不应将其转换为intfloat

幸运的是,Decimal该类具有to_integral_value可以为您进行转换的。您可以采用以下解决方案:

def is_integer(d):
    return d == d.to_integral_value()
Run Code Online (Sandbox Code Playgroud)

例:

from decimal import Decimal

d_int = Decimal(3)
assert is_integer(d_int)

d_float = Decimal(3.1415)
assert not is_integer(d_float)
Run Code Online (Sandbox Code Playgroud)

请参阅:http : //docs.python.org/2/library/decimal.html#decimal.Decimal.to_integral_value

  • 您没有提及效率。您说“ int”将无法处理它。在没有显示`int`的解决方案太慢之前,没有理由提出更复杂的内容。 (3认同)
  • 将“Decimal”值转换为整数是正确的...但为什么不能使用“int”?Python 根据需要透明地使用任意精度整数。 (2认同)
  • 是的,您可以将其转换为任意精度的整数,但是我不确定它比使用`to_integral_value()`更有效。 (2认同)