十进制数与另一个基数的差异

时间:2014-04-23 06:35:01

标签: python

我正在使用Python。我有几对数字,我想找到它们的区别,但它们的基数是42。例如,

5.39->5.40->5.41->5.42->6.00

因此,10.38,10.24有0.14,但10.41和11.02有0.03

有没有办法用Python做到这一点?我能想象的唯一方法是为每个案例采用几个IF。

我的数据示例:

[3.08,3.15] --> 0.07
[4.39,5.10] --> 0.13
[13.00,14.12] --> 1.12
[40.42,41.01] --> 0.02

4 个答案:

答案 0 :(得分:0)

喜欢这个?使用0.42作为小数部分的上限从B中减去A.

base = 42
a = (5,10)
b = (4,39)

if a > b:
   b, a = a, b

overflow = int(b[1] < a[1])

c = (b[0]-a[0]-overflow, b[1]+base*overflow-a[1])
print(c)

问题不是很清楚。我还使用元组来避免解析。

编辑:添加了if guard

答案 1 :(得分:0)

首先,不能有基础42的元素5.42,我认为基数应该是43。

我认为这就是你想要的

a=11.02
b=10.41
base=43

def diff(a,b,base):
     x=int(a)*base+int(round((a%1)*100))
     y=int(b)*base+int(round((b%1)*100))
     print x
     print y
     return (x-y)/base+((x-y)%base)/100.0
c=diff(a,b,base)
print c                          

答案 2 :(得分:0)

这可能有点矫枉过正,但是......

digits = '0123456789abcdefghijklmnopqrstuvwxyzABCDEF'

assert len(digits) == 42

def base(n, b=2, digits=digits):
    if n < 0:
        raise ValueError("no negative numbers")
    if n < b:
        return digits[n]
    res = []
    q = n
    while q:
        q, r = divmod(q, b)
        res.append(digits[r])
    return ''.join(reversed(res))


def debase(s, base=2, digits=digits):
    if not (2 <= base <= len(digits)):
        raise ValueError("base must be >= 2 and <= %d" % len(digits))
    res = 0
    for i, v in enumerate(reversed(s)):
        digit = digits.index(v)
        res += digit * (base ** i)
    return res


class Val(object):
    def __init__(self, a, b):
        self.a = a
        self.b = base(b, 42)

    def __sub__(self, other):
        a = self.a - other.a
        b = debase(self.b, 42) - debase(other.b, 42)
        if b < 0:
            b += 42
            a -= 1
        return Val(a, b)

    def __repr__(self):
        return "Val({a}, {b})".format(a=self.a, b=debase(self.b, 42))

    def __str__(self):
        return "%d.%02d" % (self.a, debase(self.b, 42))


print Val(4,20) - Val(4,10)
# 0.10
print Val(11,2) - Val(10,41)
# 0.03

答案 3 :(得分:0)

我建议只在int中设置基本参数,但这仅适用于[2,36]中的数字n。相反,您可以使用以下内容转换为任何基地:

def frombase(numbers, n):
    return sum(float(a)*n**i for i, a in izip(count(len(numbers)-1, -1), numbers))

def tobase(number, n):
    numbers = []
    while number:
        numbers.append(int(number % n))
        number = int(number / n)
    return numbers

然后您可以通过执行以下操作来生成每对结果:

converted = map(lambda x: frombase(str(x).split('.'), 42), numbers)
print('.'.join(tobase(abs(converted[1] - converted[0]))))

我会留给您将其概括为任何一组符号 - &gt;任何其他符号集。