>>> 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
>>> from decimal import Decimal
>>> for d in (Decimal('2.72'), Decimal('3.14'), Decimal('3.0'), Decimal('3')):
... d == d.quantize(Decimal('1'))
...
False
False
True
True
9条答案
按热度按时间zynd9foi1#
你可以使用模运算来检查是否有一个非整数余数:
vh0rcniy2#
请尝试
math.floor(val) == val
或val == int(val)
。vcirk6k63#
在Python 3.6中,
Decimal
有一个方法as_integer_ratio()
。as_integer_ratio()
返回(分子,分母)元组。如果分母为1,则值为整数。jum4pzuy4#
数学上的解决方法是将十进制数转换为整数,然后测试它是否与您的数字相等。
由于
Decimal
可以具有任意精度,因此不应将其转换为int
或float
。幸运的是
Decimal
类有一个to_integral_value
可以帮你转换,你可以采用这样的解决方案:示例:
cqoc49vn5#
Decimal确实有一个“隐藏”的方法,叫做_isinteger(),它的工作原理有点像float的is_integer()方法:
正如你所看到的,你必须捕捉一个异常,或者,你可以在把值传递给Decimal之前,使用你提到的float方法或者isinstance对值进行测试。
ljsrvy3e6#
您可以在Decimal对象上调用
as_tuple()
以获取符号、数字序列和指数,它们共同定义Decimal值。如果一个规格化Decimal的指数为非负,那么你的值就没有小数部分,也就是说,它是一个整数,所以你可以很容易地检查这一点:
试试看:
x一个一个一个一个x一个一个二个x
dkqlctbz7#
根据上面所说的,我使用了:
所以你可以使用下面的一个程序:
它将为您提供所需的布尔值。
7uhlpewt8#
Decimal类有一个函数
to_integral_exact
,它将十进制转换为整数,并且如果有任何非零数字被丢弃,也会发出信号。https://docs.python.org/3/library/decimal.html#decimal.Decimal.to_integral_exact使用这些信息,我们也可以实现浮点数的
is_integer
用于十进制:使用上述函数:
6g8kf2rb9#
另一种方法是使用
quantize()
方法,该方法通常用于舍入小数: