Find common factor to convert list of floats to list of integers

前端 未结 2 1720
鱼传尺愫
鱼传尺愫 2021-01-22 21:05

I have a list of floats which comes from some other function. What I know is that in ideal world there exist a common factor which can be used to multiply each term to obtain li

相关标签:
2条回答
  • 2021-01-22 21:33

    The brute force solution. Still looking for something more universal...

    def find_int(arr):
        test = False
        epsilon = 1e-15
        maxint = 1000
        for i in range(2, maxint, 1):
            for item in arr:
                if abs(i*item-round(i*item)) < epsilon:
                    test = True
                else:
                    test = False
                    break
            if test:
                print i
                return [int(round(i*item)) for item in arr]
        print "Could not find one"
        return arr
    
    0 讨论(0)
  • 2021-01-22 21:39

    Python's Fraction type can convert floating points to rationals with denominators under 1000000, and then you can find the lowest common denominator.

    >>> from fractions import Fraction
    >>> a = [2.3333333333333335, 4.666666666666667, 1.0, 1.6666666666666667]
    >>> [Fraction(x).limit_denominator() for x in a]
    [Fraction(7, 3), Fraction(14, 3), Fraction(1, 1), Fraction(5, 3)]
    

    A straightforward way to find the least common multiple using the math.gcd function:

    >>> denoms = [3,3,1,2]
    >>> functools.reduce(lambda a,b: a*b//math.gcd(a,b), denoms)
    6
    
    0 讨论(0)
提交回复
热议问题