2016-04-04 7 views
3

Эти три номера 1.2, 0.0034, 56000 все имеют одну общую черту: две цифры точность. Допустим, я хочу сообщить расчетную полосу пропускания нескольких очень разных устройств, которые колеблются от килобайт в секунду до гигабайт в секунду, все из которых варьируются до% 10. Самый простой способ для моих читателей, чтобы быстро понять результаты для меня, чтобы преобразовать все к общему блоку (скажем, МБ/с), выстраиваются десятичной точки,номера печати с постоянной или фиксированной точностью

1.2 
    0.0034 
56000 

и избежать печати лишних цифр ; если мои вычисленные значения равны 1.193225, 0.00344791 и 56188.5622, то моим читателям нужно только увидеть выше - остальное - шум. Несмотря на широкие возможности форматирования чисел с плавающей точкой, Python, похоже, не имеет чистого способа печати чисел с фиксированной точностью. Какой был бы лучший способ сделать это?

Примечание по оценке этого вопроса: я выберу лучший (то есть простой, понятный, элегантный) ответ на первый ответ. Не надо спешить.

+3

Вы можете напечатать их в научной нотации, используя формат ''..%. ''. Также должен быть некоторый родственный вопрос о [«читаемых человеком номерах»] (http://stackoverflow.com/search?q=python+human+readable+numbers). –

+0

Научная нотация требует, чтобы читатели понимали часть «e» и признавали, что 1e99 безумно больше 1e13. Он не показывает, сколько порядков величины отличаются. – duanev

+1

Вы выводите в режиме реального времени или сначала получаете все данные? –

ответ

2
import math 


def round_s(n): 
    if not n: 
     return n 
    e = int(math.floor(math.log10(abs(n)))) - 1 
    return round(n, -e) 


def fmt(n, size): 
    return '{n:{size}f}'.format(size=size, n=n).rstrip('0').rstrip('.') 


numbers = [ 
    1.193225, 
    1.0, 
    0, 
    -1.0, 
    0.00344791, 
    -0.00344791, 
    56188.5622, 
    -56188.5622, 
] 

for n in numbers: 
    print '{:12.5f} => {}'.format(n, fmt(round_s(n), 14)) 

Выход:

 1.19322 =>  1.2 
    1.00000 =>  1 
    0.00000 =>  0 
    -1.00000 =>  -1 
    0.00345 =>  0.0034 
    -0.00345 =>  -0.0034 
56188.56220 => 56000 
-56188.56220 => -56000 

Здесь вы идете.

1

Я бы объединить два переполнения стека ответов (в предположении, что каждый является лучшим способом выполнить две половинки этой задачи): Round to a specific number of significant figures и align the numbers using the formatting language

from math import log10, floor 
NUM_DIGITS = 2 # Number of significant digits 

# An example input 
number = 1.193225 

# Round the number 
rounded = round(number, -int(floor(log10(number))) + (NUM_DIGITS - 1)) 

# Print aligned to the decimal point 
print('{part[0]:>3}.{part[1]:<3}'.format(part=str(rounded).split('.'))) 

Вы должны настроить две ширины в форматор строк должен быть по крайней мере столь же широким, как и самое широкое целое число и десятичная часть чисел. Полные объяснения можно найти на соответствующих связанных страницах.

0

Если вы хотите работать на любую длину строки, которую вы должны знать количество макс суммы цифр, которые будут до десятичного:

def my_format(numbers): 
    mxi = max(len(str(num).split(".")[0]) for num in numbers) 
    for num in numbers: 
     if isinstance(num, float): 
      t = "{}".format(float("{:.2g}".format(num))) 
      print(t.rjust((mxi + len(t.split(".")[-1]) + 1), " ")) 
     else: 
      print("{:{mx}}".format(num, mx=mxi) 

которая должна совпадать для любой длины:

In [10]: numbers = [ 
    1.193225, 
    1.0, 
    0, 
    -1.0, 
    0.00344791, 
    -0.00344791, 
    56188.5622, 
    -56188.5622, 
    123456789, 
    12, 
    123] 

In [11]: my_format(numbers) 
     1.2 
     1.0 
     0 
     -1.0 
     0.0034 
     -0.0034 
    56000.0 
    -56000.0 
123456789 
     12 
     123 

 Смежные вопросы

  • Нет связанных вопросов^_^