Просто из любопытства ... нужно ли использовать десятичный модуль? Почему бы не с плавающей точкой с округлением чисел в значащие цифры, когда вы готовы их увидеть? Или вы пытаетесь отслеживать значимые цифры вычислений (например, когда вам нужно выполнить анализ ошибок результата, вычисляя вычисленную ошибку как функцию неопределенностей, которые вошли в расчет)? Если вам нужна функция округления, которая округляет число слева, а не справа, попробуйте:
def lround(x,leadingDigits=0):
"""Return x either as 'print' would show it (the default)
or rounded to the specified digit as counted from the leftmost
non-zero digit of the number, e.g. lround(0.00326,2) --> 0.0033
"""
assert leadingDigits>=0
if leadingDigits==0:
return float(str(x)) #just give it back like 'print' would give it
return float('%.*e' % (int(leadingDigits),x)) #give it back as rounded by the %e format
Числа будут выглядеть правильно, когда вы печатаете их или преобразуете их в строки, но если вы работаете в командной строке и не печатаете их явно, они могут выглядеть немного странно:
>>> lround(1./3.,2),str(lround(1./3.,2)),str(lround(1./3.,4))
(0.33000000000000002, '0.33', '0.3333')