Python - фиксированный показатель в научной нотации? - PullRequest
13 голосов
/ 25 ноября 2011

Рассмотрим следующий фрагмент Python:

for ix in [0.02, 0.2, 2, 20, 200, 2000]:
  iss=str(ix) + "e9"
  isf=float(iss)
  print(iss + "\t=> " + ("%04.03e" % isf ) + " (" + str(isf) + ")")

Он генерирует следующий вывод:

0.02e9  => 2.000e+07 (20000000.0)
0.2e9   => 2.000e+08 (200000000.0)
2e9     => 2.000e+09 (2000000000.0)
20e9    => 2.000e+10 (20000000000.0)
200e9   => 2.000e+11 (2e+11)
2000e9  => 2.000e+12 (2e+12)

Мой вопрос - возможно ли "вернуться назад?""как-то?То есть:

2.000e+07 => 0.02e9 
2.000e+08 => 0.2e9
2.000e+09 => 2e9    
2.000e+10 => 20e9   
2.000e+11 => 200e9  
2.000e+12 => 2000e9 

... Я бы указал, что хочу, чтобы показатель степени был "e+09";и затем любое число, которое я выбрасываю в эту гипотетическую функцию, возвращает значение числа в этом показателе степени?Можно ли было бы указать заполнение нулями как для целой, так и для десятичной части в каждом случае?(т.е. 000.0200e9 и 020.0000e9)?

Ответы [ 3 ]

20 голосов
/ 25 ноября 2011

Отформатируйте его самостоятельно (см. Спецификация формата Mini-Language ):

for ix in [.02e9,.2e9,2e9,20e9,200e9,2000e9]:
    print('{:.3e} => {:0=8.3f}e9'.format(ix,ix/1e9))

выход

2.000e+07 => 0000.020e9
2.000e+08 => 0000.200e9
2.000e+09 => 0002.000e9
2.000e+10 => 0020.000e9
2.000e+11 => 0200.000e9
2.000e+12 => 2000.000e9

Объяснение

{:0=8.3f} означает «заполнение нулями, заполнение между знаком и числом, общая ширина поля 8, 3 знака после запятой в формате с фиксированной запятой».

2 голосов
/ 25 ноября 2011

Ах, хорошо, понял:

for ix in [0.02, 0.2, 2, 20, 200, 2000]:
  iss=str(ix) + "e9"
  isf=float(iss)
  isf2=isf/float("1e9")
  isf2s = ("%04.03f" % isf2) + "e9"
  print(iss + "\t=> " + ("%04.03e" % isf ) + " (" + str(isf) + ")" + " -> " + isf2s )

... дает:

0.02e9  => 2.000e+07 (20000000.0) -> 0.020e9
0.2e9   => 2.000e+08 (200000000.0) -> 0.200e9
2e9 => 2.000e+09 (2000000000.0) -> 2.000e9
20e9    => 2.000e+10 (20000000000.0) -> 20.000e9
200e9   => 2.000e+11 (2e+11) -> 200.000e9
2000e9  => 2.000e+12 (2e+12) -> 2000.000e9

Извините за публикацию,
Ура!

0 голосов
/ 20 апреля 2019

Для тех, кто все еще сталкивается с этим спустя годы ...

Вы можете использовать десятичное число питона с квантованием

https://docs.python.org/3.6/library/decimal.html#decimal.Decimal.quantize

...