代码之家  ›  专栏  ›  技术社区  ›  Jed Smith

巨蟒没有给我显示的这个数字有精度吗?

  •  2
  • Jed Smith  · 技术社区  · 15 年前

    我在这里遇到了一些奇怪的事情,我很困惑——我感觉这与浮动精度有关,但是我很惊讶,如果是这样的话,python不会显示近似误差。

    我正在工作 Project Euler problem 62 . 作为一个简单的测试(我已经用不同的方法解决了),我有一个 is_cube 我想检查一个数的立方体是否完美。所以,为了尝试给出的样本,我这样做了:

    def is_cube(i):
        c = i ** (1./3)
        print "c is", c
    

    当我用i=41063625运行时,预期输出为:

    c is 345.0
    

    这就是意外发生的地方:

    def is_cube(i):
        c = i ** (1./3)
        print "c is", int(c)
    

    突然,我有了这个:

    c is 344
    

    价值 c 与我的相比 345.0 字面的,或者-- c < 345.0 是True。

    这个数字是否精确到python没有显示的?我似乎记得我读过一篇关于改变的文章,使彩车在印刷时显得更为理智;是这样吗?这两种情况有什么不同?

    >>> def is_cube(i):
    ...     c = i ** (1./3)
    ...     print "c is", c
    ... 
    >>> is_cube(41063625)
    c is 345.0
    >>> 41063625 ** (1./3)
    344.99999999999989
    

    编辑: 窗户还开着,就这样做了:

    >>> print _
    345.0
    

    现在我开始想我应该早就知道了 print 是罪魁祸首。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Pierre Bourdon    15 年前

    这是使用 c.__str__() (又名。 str(c) ):

    print "c is", c
    

    这是使用 c.__repr__() (又名。 repr(c) ):

    >>> c # In the Python shell
    

    IIRC __str__ 截断为10位小数,而 __repr__ 走得更远。要获得与python shell中相同的行为,可以执行以下操作:

    print repr(c)
    # Or
    print "%r" % c
    # Or
    print "%.16f" % c
    

    您在消息中所说的更改仅仅是关于python 3.1的,并且不会改变输出的精度:gay的算法用于 第二乐章 在python 3.1中的浮点数上,当给定两个产生相同浮点数值的表示选项(如 0.2 0.2000000000000001 ,选择最短的一个。

        2
  •  0
  •   10ToedSloth    15 年前
        print "c is", int(c)
    

    整数转换只会删除小数点后的任何内容,因此即使您有344.99999999999,它也将始终向下舍入。 你可以用旧的印刷品%

     print'c is %5.0f' % c
    

    或者,如果需要整数,可以使用Round

    print'c is %d' % round(c,0)
    

    另外,您可能对多维数据集根问题的其他解决方案感兴趣 here