【问题标题】:Python strange int behaviorPython奇怪的int行为
【发布时间】:2012-11-10 13:53:16
【问题描述】:

看看这个:

print 41063625 ** (1.0/3)  # cube-root(41063625) = 345
print int(345.0)
print int(41063625 ** (1.0/3))

它输出:

345.0
345
344

我期待最后一行是345,因为我期待int(41063625 ** (1.0/3)) 等于int(345.0) 反过来等于345,正如其他两个输出所暗示的那样。然而,显然情况并非如此。谁能告诉我这里发生了什么?

【问题讨论】:

    标签: python int


    【解决方案1】:

    Print(或者更确切地说是float.__str__)正在对输出进行四舍五入。

    In [22]: str( 41063625 ** (1.0/3) )
    Out[22]: '345.0'
    

    浮点表示 41063625 ** (1.0/3) 小于 345,所以当你取它的 int 时,你得到的是 344 而不是 345。

    In [15]: 41063625 ** (1.0/3)
    Out[15]: 344.9999999999999
    
    In [16]: int(345.0)
    Out[16]: 345
    
    In [17]: int(41063625 ** (1.0/3))
    Out[17]: 344
    

    如果你想要最接近的int,你可以使用round:

    In [18]: round(41063625 ** (1.0/3))
    Out[18]: 345.0
    

    或者,获取int

    In [19]: int(round(41063625 ** (1.0/3)))
    Out[19]: 345
    

    【讨论】:

    • 嗯,这有道理——不知道像这样舍入是print 的一个功能。谢谢!
    • 发布str( 41063625 ** (1.0/3) ) 的输出可能是说明性的,因为这是print 实际打印的内容。
    • @A.R.S.:在 3.2+ 中,float.__str__ 使用 repr,它使用最小位数来舍入到原始浮点数。例如:print(41063625 ** (1.0/3)) 输出 344.9999999999999
    【解决方案2】:

    因为41063625 ** (1.0/3) 不是 345.0:

    In [7]: 41063625 ** (1.0/3)
    Out[7]: 344.9999999999999
    
    In [8]: int(344.9999999999999)
    Out[8]: 344
    

    【讨论】:

      【解决方案3】:

      嗯,我从计算中得到的是这样的:

      >>> 41063625 ** (1.0/3)
      344.9999999999999
      >>> int(345.0)
      345
      >>> int(41063625 ** (1.0/3))
      344
      

      所以得到 344 是绝对正确的。浮点数的内部表示缺乏一定的准确性,因此转换为 int 将始终给出下限值。

      您可以使用round() 函数获得更合理的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-10
        • 2017-10-16
        • 2012-10-03
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多