嘿,我试图使用带有大浮点数的模数,但是python似乎不喜欢那些大数字。我的目标是检查2个整数的除法是否给我一个整数(所以如果division_result%1 == 0
或不是)
示例:
x = 3**2
x = x+0.3
x%1
result = 0.3000000000000007 | expected = 0.3
x = 3**199
x = x+0.3
x%1
result = 0.0 |expected = 0.3
如何提高结果的精确度/或找到一种聪明的方法来检查除法是否给出整数?
答案 0 :(得分:4)
并非所有分数都可以represented exactly as floats。因此,您的方法将不起作用(如预期的那样)。
您可能会尝试的是fractions
模块:
from fractions import Fraction
print(repr(Fraction(25, 5))) # Fraction(5, 1)
这种方式可以使用Fraction
:
def div_result_int(a, b):
f = Fraction(a, b)
return f.denominator == 1
print(div_result_int(a=25, b=5)) # True
print(div_result_int(a=25, b=3)) # False
答案 1 :(得分:2)
对于整数apply plugin: 'me.tatarka.retrolambda'
和x
,当且仅当y
时,分数y/x
才是整数。只要y % x == 0
和x
是整数,您就不必担心浮点错误或特殊数字类或任何东西。只需确保y
和x
实际上表示为整数而不是浮点数。由于python可以处理大整数,因此适用于长度超过64位的整数,例如:
y
答案 2 :(得分:0)
您只需使用float.is_integer()
来测试实数或自然数值:
>>> x=3**23
>>> y=3**299
>>> res=x/y
>>> res
2.0631637441810574e-132
>>> res.is_integer()
False
>>> res=4.0000000000004
>>> res.is_integer()
False
>>> res=4.000
>>> res.is_integer()
True
答案 3 :(得分:0)
另一个选项是decimal
模块。
用你的第一个例子:
import decimal
x = decimal.Decimal('9.3')
x % 1
,结果为Decimal('0.3')
使用第二个示例,您需要将精度设置为50:
decimal.getcontext().prec = 50
x = decimal.Decimal('171792506910670443678820376588540424234035840667.3')
再次,x % 1
的结果为Decimal('0.3')