模数如何处理大浮点数

时间:2017-01-11 13:25:32

标签: python numbers

嘿,我试图使用带有大浮点数的模数,但是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

如何提高结果的精确度/或找到一种聪明的方法来检查除法是否给出整数?

4 个答案:

答案 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 == 0x是整数,您就不必担心浮点错误或特殊数字类或任何东西。只需确保yx实际上表示为整数而不是浮点数。由于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')