DecimalFormat - лучший способ вывода, но я не предпочитаю его. Я всегда делаю это все время, потому что он возвращает двойное значение. Поэтому я могу использовать его больше, чем просто вывод.
Math.round(selfEvaluate*100000d.0)/100000d.0;
ИЛИ
Math.round(selfEvaluate*100000d.0)*0.00000d1;
Если вам нужно большое значение десятичных знаков, вы можете использовать BigDecimal. В любом случае .0
важно. Без него округление 0,333333d5 возвращает 0,33333 и допускается только 9 цифр. Вторая функция без .0
имеет проблемы с возвратом 0.30000 0.30000000000000004.
У PythonInfo wiki есть решение для этого.
FAQ: Как скопировать байты в Python из ctypes.Structure?
def send(self): return buffer(self)[:]
Часто задаваемые вопросы: Как скопировать байты в ctypes.Structure из Python?
blockquote>def receiveSome(self, bytes): fit = min(len(bytes), ctypes.sizeof(self)) ctypes.memmove(ctypes.addressof(self), bytes, fit)
Их
send
является (более или менее) эквивалентомpack
, аreceiveSome
- это типpack_into
. Если у вас есть «безопасная» ситуация, когда вы распаковываете в структуру того же типа, что и оригинал, вы можете сделать однострочное, какmemmove(addressof(y), buffer(x)[:], sizeof(y))
, скопироватьx
вy
. Конечно, у вас, вероятно, будет переменная как второй аргумент, а не буквальная упаковкаx
.
Проверено на Python3
e = Example(12, 13)
serialized = bytes(e)
deserialized = Example.from_buffer_copy(serialized)
Посмотрите эту ссылку на двоичный код ввода / вывода в python:
http://www.dabeaz.com/blog/2009/08/python-binary-io-handling .html
Исходя из этого, вы можете просто написать следующее для чтения из буфера (а не только файлов):
g = open("foo","rb")
q = Example()
g.readinto(q)
Для записи просто:
g.write(q)
То же самое для использования сокетов:
s.send(q)
и
s.recv_info(q)
Я провел некоторое тестирование с помощью pack / unpack и ctypes, и этот подход быстрее всего, за исключением прямой записи в C
pack
- это просто bytearray(q)
, который также использует буферный протокол. Для общей распаковки 2.6 также добавлен, например, Example.from_buffer(buf)
, если buf
изменен, иначе Example.from_buffer_copy(buf)
.
– eryksun
16 July 2013 в 15:24
buffer
? Если вы попытаетесь просто заменить его наmemoryview
, вы получитеTypeError: invalid indexing of 0-dim memory
– Jonathon Reinhart 28 February 2017 в 16:39bytes(self)
для извлечения структурных байтов. – Zanapher 12 May 2017 в 14:19