【问题标题】:Integer precision with python 2.7python 2.7的整数精度
【发布时间】:2016-06-20 11:19:31
【问题描述】:

当一个大整数的长度超过 15 时,最后一位被设置为 0。如何避免这种情况?例如,

a=[1,100,20,167,52,96,181,0]
b = 0
for i in range(8):
    b = b + a[i]*(2**(8*(i)))
    print a[i]
print "%f" % b

b 是 51052750042326016,但实际值应该是 51052750042326017。

【问题讨论】:

    标签: python-2.7


    【解决方案1】:

    来自Floating Point Limitations 页面:

    在运行 Python 的典型机器上,有 53 位精度 可用于 Python 浮点数

    这样:

    >>> a = 2 ** 53 + 1
    >>> a
    9007199254740993L
    >>> int(float(a))
    9007199254740992L
    

    在上面的示例中,通过在 print 中使用格式 %f,您将整数 b 隐式转换为浮点数。由于它的量级大于 Python 中可以精确表示为浮点数的量级,因此它被赋予了最接近的 53 位表示。

    避免这种情况的最简单方法是将整数作为打印为整数,格式为%d

    【讨论】:

      【解决方案2】:

      在您的代码中,b 被分配给一个整数,而不是浮点类型,因此您可以使用"%d" 格式来打印它。浮点值具有 issue and limitation,因为它们在计算机硬件中表示为以 2 为底的(二进制)分数:

      a=[1,100,20,167,52,96,181,0]
      b = 0
      for i in range(8):
          b = b + a[i]*(2**(8*(i)))
          print a[i]
      print "%d" % b
      

      print "%d %f" % (b, b)的输出:

      51052750042326017 51052750042326016.000000
      

      来自docs

      很遗憾,大多数小数不能完全表示为 二进制分数。结果是,一般来说,小数 您输入的浮点数仅由二进制近似 机器中实际存储的浮点数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多