浮点数如何存储在python中

时间:2015-02-09 04:53:23

标签: python floating-point

过去几天我一直在使用python进行分配。我注意到一件奇怪的事情 -

  1. 当我将字符串转换为浮点数时 - 它提供与字符串完全相同的数字位数。
  2. 当我使用带有4个字节浮点数的struct.pack()将此数字放入文件中并使用struct.unpack()将其读回时,它给出了一个不完全相同的数字但是我想要的更长的字符串根据浮点存储

    实施例。 - 字符串 - 0.931973

    Float num - 0.931973

    来自文件 - 0.931972980499(在struct pack之后并解压缩为4个字节)

  3. 因此,当我从字符串中读取数字时,我无法理解python如何实际存储我的数字。

    修改 编写浮点数(我认为在ubuntu的python 2.7中反过来,d- double和f-float)

    buf = struct.pack("f", float(self.dataArray[i]))
    fout.write(buf)
    

    查询 -

    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    
    

    我无法理解为什么会发生这种情况

1 个答案:

答案 0 :(得分:3)

Python中的

float实际上是C程序员所称的double,即它是64位(或者在某些平台上甚至更宽)。因此,当您将其存储为4个字节(32位)时,您将失去精确度。

如果您使用d格式代替f,您应该会看到预期的结果:

>>> struct.unpack('d', struct.pack('d', float('0.931973')))
(0.931973,)