检查整数/浮点数是否包含特定数字

时间:2018-02-17 06:40:16

标签: python string python-2.7 math

我试图找到一种方法来检查数字是否包含" 2" " 3" " 4" " 5&#34 ;; 所以1234的含义是"假"和0110意思是真的。

我尝试将float转换为字符串并使用.find()进行检查,但它太长了,我无法正常转换。

a = Decimal(1) / Decimal(123456789)
print a

8.100000073710000670761006104E-9

a = str(a)
print a

8.100000073710000670761006104E-9

所以请帮帮我(

编辑:

我有一个计算公式,想要优化结果。所以我可以使用结果作为输入并计算原始数字。

它是某种征兵算法,需要特殊的数字集。

例如

9,9989001209866914639389667136615e-8

是我设定的原因

1 / 9,9989001209866914639389667136615e-8 = 10001100

1/10001100 = 9,9989001209866914639389667136615e-8

另外,数字源已单独生成。我尝试阅读源代码并优化只接受的数字。

4 个答案:

答案 0 :(得分:1)

为了划分这些数字并摆脱科学记数法,我使用了以下代码:

from decimal import *
a = '{0:f}'.format(Decimal(1)/Decimal(123456789))
print a.find('1234')
print a.find('810')

我不确定您在字符串中搜索的条件。但我希望这会有所帮助。

答案 1 :(得分:1)

我不了解您最初的问题描述。如果您的意思是数字的倒数是否包含这些数字,则一个问题是大多数此类结果具有无限数字。写一个像0110这样的数字会使问题更加复杂,因为Python 2中的那个八进制(在Python 3中无效);它的价值是72.

但有一件事我可以很容易地说,#34;太长了"部分。您可以从Decimal:

请求任意(但仍然是有限的)精度
>>> f='{:f}'.format(decimal.Context(prec=200).divide(1,1234))
>>> f[:40]
'0.00081037277147487844408427876823338735'
>>> f.index('00810372')
3
>>> f.index('00810372', 3+1)
91

因此,1/1234的数字流在88位小数后重复。所有有理数都有一些这样的循环长度(在6855006位之后的1/123456789循环)。但是默认的十进制上下文没有产生足够的数字来观察这个数字的整个循环。

对这一挑战的正确解决方案可能包括明确执行长除法,并跟踪沿途遇到的分数。然后,您可以轻松检测何时发现重复。一些事情(可能很慢):

fractions=set()
digits=[]
while fraction not in fractions:
    digit = math.floor(fraction)
    fractions.add(fraction)
    digits.append(digit)
    fraction = (fraction-digit)*10

答案 2 :(得分:0)

如果我理解你的问题,你可以尝试使用正则表达式。这是一种交互式方式,可以解决您的问题:https://regex101.com/r/i2mZmK/2/

python的潜在解决方案:

import re
from decimal import * 

regex = re.compile(r"(2|3|4|5)")

a = Decimal(1) / Decimal(123456789)


def check_number():
    result = regex.search(str(a))

    if result is None:
        check = True

    else:
        check = False

    return check

print(check_number())

答案 3 :(得分:-2)

def returnsomething():
    demo_number = 345.43565
    list = [2, 3, 4]
    for number in list:
      if str(number) in str(demo_number):
      return True
    return False