2014-11-02 4 views
0

Я читаю большой файл ascii, преобразовывая его в двоичный файл и сжимая его, чтобы уменьшить размер файла. Я хотел бы точно воспроизвести исходный файл. Однако форматирование номера является проблемой. Я считаю, что исходный файл печатается с минимальным количеством символов, необходимых для однозначной идентификации числа с плавающей запятой.Минимальные символы форматирования символов для Python

import struct 
x = [3.14, 3.1] 
y = list(struct.unpack('2f', struct.pack('2f', *x))) 
print str(x) 
print str(y) 

Который возвращает [3.14, 3.1] [3.140000104904175, +3,0999999046325684]

Я хотел бы напечатать у так же, как х. Как я могу это сделать? Кроме того, я не понимаю, что происходит под капотом с функцией str. Не могли бы вы объяснить? Я использую Python 2.7.

Update:

import struct 
x = [3.14, 3.1] 
y = list(struct.unpack('2d', struct.pack('2d', *x))) 
print str(x) 
print str(y) 

Код выше возвращений:

[3.14, 3.1] 
[3.14, 3.1] 

Так функция ул обрезает символы, но только тогда, когда значение очень близко к к 64-битового значения с плавающей точкой. Я хотел бы, чтобы подобное поведение было когда значение очень близко к 32-битовому значению с плавающей запятой.

+0

Yours является [дубликатом вопрос] (http://stackoverflow.com/questions/26689004/format-a-float-to-a-string-with-minimum- characters-in-python), я предлагаю удалить старый вопрос или, лучше, удалить его и изменить предыдущий. – gboffi

ответ

0

Эта проблема в том, что питон поплавка 64 бит. Отбрасывание до numpy.float32 перед вызовом str() приводит к тому, что число отформатировано так, как я хочу.

print str(np.float32(y[0])) 

печатает

3.14 
0

попробовать это:

for i in y: 
    print "%.2f" % i 

все str() делает просто преобразовать объект он дается в строку

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