Я использовал python для своих заданий в течение последних нескольких дней. Я заметил одну странную вещь:Как float хранятся в python
- Когда я конвертирую строку в float - она дает точно такое же количество цифр, что и в строке.
Когда я помещал это число в файл с помощью struct.pack() с 4 байтами и читал его с помощью struct.unpack(), он дает число не точно такое же, но некоторую более длинную строку, которую я ожидаю, если в соответствии с хранение с плавающей запятой
Ex. - String - 0.931973
Float Num - 0.931973
из файла - 0.931972980499 (после того, как структура пакета и распаковать в 4 байта)
Так что я не могу понять, как питон на самом деле хранится мой номер ранее когда я прочитал его из строки.
EDIT Дать поплавок (я думаю, что в Python 2.7 на убунту другой свой путь вокруг, d- двойной и е-поплавок)
buf = struct.pack("f", float(self.dataArray[i]))
fout.write(buf)
Query -
buf = struct.pack("f", dataPoint)
dataPoint = struct.unpack("f", buf)[0]
node = root
while(node.isBPlusNodeLeaf()) == False:
node = node.findNextNode(dataPoint)
findNextNode -
def findNextNode(self, num):
i = 0
for d in self.dataArray:
if float(num) > float(d):
i = i + 1
continue
else:
break
ptr = self.pointerArray[i]
#open the node before passing on the pointer to it
out, tptr = self.isNodeAlive(ptr)
if out == False:
node = BPlusNode(name = ptr)
node.readBPlusNode(ptr)
return node
else:
return BPlusNode.allNodes[tptr]
как только я доберусь до листа читает лист и проверяет, существует ли там дататоп.
for data in node.dataArray:
if data == dataPoint:
return True
return False
Таким образом, в этом случае она возвращает неудачную поиск точки данных - 0.931972980499 которая там хотя.
Хотя следующий код работает отлично -
for data in node.dataArray:
if round(float(data), 6) == dataPoint:
return True
return False
Я не могу понять, почему это происходит
Возможно зависит от реализации питона, а также. – Marcin
Возможный дубликат [Упаковка и распаковка двоичного float в python] (http://stackoverflow.com/questions/16165488/packing-and-unpacking-binary-float-in-python) – alfasin
Привет, Альфасин, я уже проверил этот вопрос в то время как я был кодированием, Его разные, coz Я не могу понять, почему последний снипп работает, а 1-й не работает – codeomnitrix