2015-12-16 7 views
2

Код успешно обрабатывает большой файл из многих номеров в несколько меньших текстовых файлов с номером, но он вызывает интересную причуду.Почему float() отключает завершающие нули?

Все номера должны быть до четырех знаков после запятой, например 2.7400, но вместо этого они печатаются как 2,74.

Вот отрывок из файла

0.96 
0.53 
0.70 
0.53 
0.88 
0.97 

Почему это происходит? Есть ли способ исправить это или просто причуду float()?

from itertools import islice 

def number_difference(iterable): 
    return float(iterable[-1].strip('\n')) - float(iterable[0].strip('\n')) 

def file_crop(big_fname, chunk_fname, no_lines): 
    with open(big_fname, 'r') as big_file: 
     big_file.readline() 
     ifile = 0 
     while True: 
      data = list(islice(big_file, no_lines)) 
      if not data: 
       break 
      with open('{}_{}.locs'.format(chunk_fname, ifile), 'w') as small_file: 
       offset = int(float(data[0].strip('\n'))) 
    map(lambda x: str(float(x.strip('\n')) - offset) + '\n', data) 
    small_file.write('{} {} L\n'.format(len(data), number_difference(data))) 
     small_file.write(''.join(map(lambda x: str(round((float(x.strip('\n')) - offset),4)) + '\n', data))) 
      ifile += 1 
+2

Представления 'float' для 2.74 и 2.7400 идентичны. Невозможно узнать, сколько лишних ненужных нулей было использовано в исходном строковом представлении после того, как оно было преобразовано в 'float'. – paddy

+1

«float» представляет собой число, а конечные нули не являются свойством числа. 2,74 = 2,7400. – user2357112

ответ

2

IEEE 754 числа с плавающей точкой (из которых float является binary64) не предназначены для хранения точности информации. Если вам нужно это сделать, вместо этого вы должны использовать decimal.Decimal.

>>> decimal.Decimal('0.70') 
Decimal('0.70') 
>>> print decimal.Decimal('0.70') 
0.70 

Для получения более подробной информации см. decimal documentation.

+0

Спасибо! Я посмотрю на «decimal.Decimal» – MrDoe777

3

Вы можете сохранить нули при форматировании вывода:

например: если выход 0,96,

x= 0.96 
"{0:.4f}".format(x) 

Выход:

'0.9600' 

Выход будет нить ..

Нижеприведенная статья может быть полезной: https://docs.python.org/2/tutorial/floatingpoint.html

Это объясняет, почему Python отображает всплывающие подсказки в вышеуказанном формате.

+1

Это не отвечает на вопрос «почему» в вопросе – paddy

1

Число с плавающей запятой является просто приближением к python (и другому языку программирования) ... например, десятичное значение вычисляется как двоичное значение. Трудно найти точные значения для большинства базы 10 операций

После тщательного рассмотрения этой ссылке, вы увидите, почему питон не дал точные значения для операции конвертируется в базе 2

https://docs.python.org/2/tutorial/floatingpoint.html

с использованием печать может также сделать работу

print("%.4f" % 0.96) or 
whatever_file.write("%.4f" % 0.96) 
Смежные вопросы