Проблемы с десятичными и научными обозначениями в Python 2.6.6 - PullRequest
2 голосов
/ 26 апреля 2011

У меня проблемы с десятичными значениями, которые мне нужно использовать для арифметики в некоторых случаях и в качестве строк в других.В частности, у меня есть список показателей, например:

rates=[0.1,0.000001,0.0000001]

И я использую их для определения коэффициентов сжатия для изображений.Сначала мне нужно иметь эти значения в виде чисел, потому что мне нужно иметь возможность сортировать их, чтобы убедиться, что они в определенном порядке.Я также хочу иметь возможность преобразовывать каждое из этих значений в строки, чтобы я мог 1) встроить скорость в имя файла и 2) записать ставки и другие детали в CSV-файл.Первая проблема заключается в том, что любое число с плавающей точкой, содержащее более 6 десятичных знаков, имеет научный формат при преобразовании в строку:

>>> str(0.0000001)
'1e-07'

Поэтому я попытался использовать десятичный модуль Python, но он также преобразовывает некоторые числа с плавающей точкой в ​​научную запись (казалось бы, вопреки документам, которые я прочитал).Пример:

>>> Decimal('1.0000001')
Decimal('1.0000001')
# So far so good, it doesn't convert to scientific notation with 7 decimal places
>>> Decimal('0.0000001')
Decimal('1E-7')
# Scientific notation, back where I started.

Я также изучал форматирование строк, как предлагается в нескольких сообщениях, но мне не повезло.Любой предложения и указатели приветствуются этим неофитом Python.

Ответы [ 3 ]

5 голосов
/ 26 апреля 2011
'{0:f}'.format(Decimal('0.0000001'))

Вышесказанное должно работать на вас

5 голосов
/ 26 апреля 2011

Затем необходимо указать формат строки:

["%.8f" % (x) for x in rates]

Это дает ['0.10000000', '0.00000100', '0.00000010'].Работает с Decimal тоже.

4 голосов
/ 26 апреля 2011

См. % formatting, особенно преобразования с плавающей запятой:

'e' Экспоненциальный формат с плавающей запятой (строчные). (3)

'E' Экспоненциальный формат с плавающей запятой (заглавные буквы). (3)

'f' Десятичный формат с плавающей точкой. (3)

'F' Десятичный формат с плавающей точкой. (3)

'g' Формат с плавающей точкой. Использует экспоненциальный формат в нижнем регистре, если показатель степени меньше -4 или не меньше точности, в противном случае используется десятичный формат. (4)

'G' Формат с плавающей точкой. Использует экспоненциальный формат в верхнем регистре, если показатель степени меньше -4 или не меньше точности, в противном случае используется десятичный формат. (4)

Пример с использованием формата f.

>>> ["%10.7f" %i for i in rates]
[' 0.1000000', ' 0.0000010', ' 0.0000001']
>>> 

Вы также можете использовать более новый (начиная с версии 2.6) str.format() метод:

>>> ['{0:10.7f}'.format(i) for i in rates]
[' 0.1000000', ' 0.0000010', ' 0.0000001']
>>> 
...