Python浮点可被另一个浮点整除

时间:2019-03-19 21:27:37

标签: python python-2.7

有人知道在python中检查数字是否可以被python浮点中的另一个数整除的好方法吗?

我尝试的第一件事是...

Couchbase

但这会返回3.5 % 0.1 == 0.0 ,所以也许

False

还有3.5 % 0.1 >= 1e-6 ...真可惜...事实证明

False

所以这有效:

3.5 % 0.1
>> 0.099999999924

但这似乎很危险,因为我必须选择一个LAMBDA。如果LAMBDA = 1e-9 def is_divisible_by(x, y): m = x % y dy = abs(y - m) return m < LAMBDA or dy < LAMBDA is_divisible_by(3.5, 0.1) ...

y = LAMBDA / 2

那么

is_divisible_by(LAMBDA/2, (LAMBDA/2) + 1e-10)
>>> True

笨蛋。

有没有解决这个问题而不会掉落整个兔子的整体?

2 个答案:

答案 0 :(得分:2)

根据您的浮点数的来源,decimal模块可能会有用。

>>> import decimal
>>> decimal.Decimal("3.5") % decimal.Decimal("0.1")
Decimal('0.0')

答案 1 :(得分:2)

浮点数是“模糊的”。浮点数的一个高级高级思维模型是它们代表一小部分数字(例如,1.5实际上表示1.4999和1.5002之间的某个数字)。因此,没有一种好的方法来检查一个对象是否可被另一个对象整除。相反,要检查非整数是否可以被整数整除,可以使用rational-type numbers。在python中,有一个名为Fraction的模块。您可以这样使用它

from fractions import Fraction
a = Fraction(35,10) # 3.5
b = Fraction(1,10) # .1
a%b # evaluates to Fraction(0, 1)

另一个答案提到了十进制python模块。小数和小数是可以互操作的。

from fractions import Fraction
from decimal import Decimal
a = Fraction(Decimal('3.5')) # 3.5
b = Fraction(Decimal('0.1)) # 0.1
a%b # evaluates to Fraction(0, 1)

我将提倡使用分数,因为它更加灵活

from fractions import Fraction
from decimal import Decimal
c = Decimal('1')
d = Decimal('.3')
c/d  # evaluates to Decimal('3.333333333333333333333333333')
c/d*d  # evaluates to Decimal('0.9999999999999999999999999999')
c = Fraction(c)
d = Fraction(d)
c/d # evaluates to Fraction(10, 3)
c/d*d # evaluates to Fraction(1, 1)