function chunk(er){
return er.match(/.{1,75}/g).join('\n');
}
Выше функция - это то, что я использую для Chunking Base64. Он создаст разрыв строки, когда будет 75 символов.
Вы сталкиваетесь старая проблема с числами с плавающей точкой, что не все числа могут быть представлены точно. Командная строка просто показывает Вам полную форму с плавающей точкой из памяти.
С представлением с плавающей точкой, Ваша округленная версия является тем же числом. Так как компьютеры являются двоичными, они хранят числа с плавающей точкой как целое число и затем делят его на питание два, таким образом, 13.95 будет представлен подобным способом 125650429603636838 / (2 ** 53).
Числа двойной точности имеют 53 бита (16 цифр) точности, и регулярные плавания имеют 24 бита (8 цифр) точности. тип с плавающей точкой в Python использует двойную точность для хранения значений.
, Например,
>>> 125650429603636838/(2**53)
13.949999999999999
>>> 234042163/(2**24)
13.949999988079071
>>> a=13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a,2))
13.95
>>> print("{0:.2f}".format(a))
13.95
>>> print("{0:.2f}".format(round(a,2)))
13.95
>>> print("{0:.15f}".format(round(a,2)))
13.949999999999999
, Если Вы только после двух десятичных разрядов (для отображения значения валюты, например), тогда у Вас есть несколько лучших вариантов:
Это делает точно, что Вы сказали ему делать и работаете правильно. Считайте больше [приблизительно 110] беспорядок с плавающей точкой и возможно попробуйте десятичное число объекты вместо этого.
Учебное руководство Python имеет приложение, названное Арифметика С плавающей точкой: Проблемы и Ограничения . Считайте его. Это объясняет, что происходит и почему Python прилагает все усилия. Это имеет даже пример, который соответствует Вашему. Позвольте мне заключить немного в кавычки:
>>> 0.1 0.10000000000000001
можно испытать желание использовать эти
round()
функция для прерывания его назад к единственной цифре, которую Вы ожидаете. Но это не имеет никакого значения:>>> round(0.1, 1) 0.10000000000000001
проблема состоит в том, что двоичное значение с плавающей точкой, сохраненное для
“0.1”
уже, было самым лучшим двоичным приближением к1/10
, таким образом пробуя к раунду, это снова can’t делает его лучше: это было уже столь хорошо, как это добирается.Другое последствие - то, что с тех пор
0.1
не точно1/10
, суммирование десяти значений0.1
не может уступить точно1.0
, также:>>> sum = 0.0 >>> for i in range(10): ... sum += 0.1 ... >>> sum 0.99999999999999989
Одна альтернатива и решение Ваших проблем использовали бы decimal
модуль.
Можно изменить выходной формат:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Большинство чисел не может быть точно представлено в плаваниях. Если Вы хотите к раунду число, потому что это - то, чего требуют Ваша математическая формула или алгоритм, то Вы хотите использовать вокруг. Если Вы просто хотите ограничить дисплей определенной точностью, то даже не используйте вокруг и просто форматируйте его как ту строку. (Если Вы хотите отобразить его с некоторым альтернативным методом округления, и существуют тонны, тогда необходимо смешать два подхода.)
>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'
И наконец, хотя, возможно, самое главное, если Вы хотите точный математика тогда, Вы не хотите плавания вообще. Обычный пример имеет дело с деньгами и сохранить 'центы' как целое число.