Модуль
decimal
может использоваться для удобного управления десятичным представлением чисел:
from decimal import Decimal
def round_to_uncertainty(value, uncertainty):
# round the uncertainty to 1-2 significant digits
u = Decimal(uncertainty).normalize()
exponent = u.adjusted() # find position of the most significant digit
precision = (u.as_tuple().digits[0] == 1) # is the first digit 1?
u = u.scaleb(-exponent).quantize(Decimal(10)**-precision)
# round the value to remove excess digits
return round(Decimal(value).scaleb(-exponent).quantize(u)), u, exponent
Пример:
for mean, err in [
(123.45, 0.0012345), # 123450 ± 1.2 (×10<sup>-3</sup>)
(8165.666, 338.9741), # 82 ± 3 (×10<sup>2</sup>)
]:
print("{} ± {} (×10<sup>{}</sup>)".format(*round_to_uncertainty(mean, err)))
Вход 123.45
, 0.0012345
сообщается как 123450 ± 1,2 (× 10 -3 ) .И 8165.666
, 338.9741
переводится в 82 ± 3 (× 10 2 ) в соответствии с правилами из текущего вопроса.