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

Python浮点可以被另一个浮点整除,python,python-2.7,Python,Python 2.7,有人知道python中检查一个数字是否可以被另一个浮点数整除的好方法吗 我尝试的第一件事是 3.5 % 0.1 == 0.0 但是这个返回为False,那么可能 3.5 % 0.1 >= 1e-6 但也是假的。。。真倒霉原来 3.5 % 0.1 >> 0.099999999924 那么这就行了: LAMBDA = 1e-9 def is_divisible_by(x, y): m = x % y dy = abs(y - m) return m <

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

我尝试的第一件事是

3.5 % 0.1 == 0.0
但是这个返回为False,那么可能

3.5 % 0.1 >= 1e-6 
但也是假的。。。真倒霉原来

3.5 % 0.1
>> 0.099999999924
那么这就行了:

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)
那么

  def is_divisible_by(x, y):
      l = y * 1e-2
      m = x % y
      dy = abs(y - m)
      return m < l or dy < l

  is_divisible_by(3.5 * 1e-10, 0.1 * 1e-10)
  >>> True

  is_divisible_by(0.21, 0.211)
  >>> True
糟糕透了


有没有办法解决这个问题而不把一只巨大的兔子整死

根据浮点数的来源,该模块可能有用

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

浮点数是模糊的。浮点数的一个好的高级心理模型是它们代表一个小范围的数字,例如1.5实际上意味着一些介于1.4999和1.5002之间的数字。因此,没有好的方法来检查一个是否可以被另一个整除。相反,要检查非整数是否可以被彼此整除,您可能需要使用。在python中,有一个用于此的模块,称为分数。你可以这样使用它

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)

浮点数是一种近似值,不可能做到这一点。为什么首先要使用浮点数呢?你可以将所有的数字放大,四舍五入,然后测试这些数字是否可除。每个程序员都应该知道关于浮点数算术的知识-可能的重复感谢。。。decimal.Decimalstrx%deciaml.Decimalstry==0.0似乎在这里起作用。问题是,如果浮点数已经是不精确的十进制数,Decimalstrx无法重新引入精度。例如:decimal.Decimalstr1.0/3*3==1将返回False。在此之前,我没有对浮点进行任何操作,因此错误量应该是非常合理的。我认为这很好。需要注意的重要一点是,传递给Decimal的uuu init_uuuu的值应该是字符串类型,这样才能使零起作用。我强烈反对浮点数的心理模型,但同意分数。分数建议。@user2357112我同意它并不完美。如果你非常熟悉,不要使用建议的心智模型。但是,如果您只是键入一个带小数的数字,而没有仔细选择它,那么IEEE 745表示法可能会有一些错误。浮点数确实代表某个范围内的精确整数,以及一堆更多的数字。这种思维模式保守且对初学者友好,但最终是错误的。有更精确的模型,但在我看来,它们对初学者不那么友好。
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)