【问题标题】:Python2/3 give different answers to the same math operation...why? (calculating percent difference) [duplicate]Python2/3 对同一个数学运算给出不同的答案……为什么? (计算百分比差异)[重复]
【发布时间】:2017-11-15 11:08:56
【问题描述】:

Python 2 和 Python 3 似乎对于查找两个量之间的百分比差异这一非常简单的数学运算得出了不同的答案。

例如:

# Python 2.7.10
>>> def percent_difference(qty1, qty2):
...     diff = max(qty1, qty2) - min(qty1, qty2)
...     print(diff)
...     percent = diff / ( (qty1 + qty2) / 2)
...     print(percent)
... 
>>> percent_difference(1, 2)
1
1

# Python 3.6.2

>>> def percent_difference(qty1, qty2):
...     diff = max(qty1, qty2) - min(qty1, qty2)
...     print(diff)
...     percent = diff / ( (qty1 + qty2) / 2)
...     print(percent)
... 
>>> percent_difference(1, 2)
1
0.6666666666666666

这是怎么回事?

(Python3 正确)

【问题讨论】:

    标签: python python-3.x python-2.7 math


    【解决方案1】:

    Python2Python3 对待整数的 div 操作不同。

    python3 中,div 操作将同样对待整数和浮点数:

    2/3 = 1.5
    2.0/3 = 1.5
    2/3.0 = 1.5
    2.0/3.0 = 1.5
    

    python2中,如果两个操作数都是整数,它将截断浮点数后面的数字:

    2/3 = 1
    2.0/3 = 1.5
    2/3.0 = 1.5
    2.0/3.0 = 1.5
    

    【讨论】:

      【解决方案2】:

      Python 3 改变了 / 运算符的行为。它过去依赖于使用的类型(即integer / integer 是整数除法,如果其中一个操作数是浮点数,则得到浮点除法)。

      Python 增强提案PEP-0238 中解释了更改的基本原理:

      正确的解决方法是微妙的:如果参数可能是复数,则将参数强制转换为 float() 是错误的;如果参数的符号为负零,则将 0.0 添加到参数不会保留参数的符号。唯一没有任何缺点的解决方案是将参数(通常是第一个参数)乘以 1.0。这使得 float 和 complex 的值和符号保持不变,并将 int 和 long 转换为具有相应值的 float。

      【讨论】:

        【解决方案3】:

        你需要告诉 Python 你想要浮点输出。 试试percent_difference(1.0, 2.0)

        【讨论】:

          猜你喜欢
          • 2014-02-24
          • 2020-12-31
          • 2020-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-17
          • 2021-01-05
          相关资源
          最近更新 更多