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

Все числа должны быть до четырех десятичных знаков, например 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
4
user5609349 16 Дек 2015 в 04:56

3 ответа

Лучший ответ

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

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

См. decimal документацию для получения полной информации.

2
Ignacio Vazquez-Abrams 16 Дек 2015 в 03:27

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

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

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

Выход:

'0.9600'

Результатом будет строка, хотя ..

Статья ниже может быть хорошо прочитана: https://docs.python.org/2/tutorial/floatingpoint.html

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

4
astrosyam 16 Дек 2015 в 02:21

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

Внимательно изучив эту ссылку, вы поймете, почему python не дал точных значений для ваших операций, преобразованных в базу 2

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

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

print("%.4f" % 0.96) or
whatever_file.write("%.4f" % 0.96)
0
repzero 16 Дек 2015 в 03:19