通常,表达式的数据类型取决于参数的类型。此规则适用于大多数运算符:就像我们将两个整数相加时,结果应为整数。但是,如果进行除法,则效果不佳,因为存在两个不同的期望。有时,我们期望除法运算会生成精确的浮点数,而其他时候,我们需要四舍五入的整数结果。
通常,divide(/)的python定义仅取决于参数。例如在python 2.7中,除数20/7为2,因为两个参数都为整数。但是,20./7将生成2.857142857142857作为输出,因为参数是浮点数。
上面的'/'定义通常会给应用程序带来问题,而这些应用程序使用的是作者未曾期望的数据类型。
考虑一个简单的程序,将温度从摄氏温度转换为华氏温度会根据输入产生两种不同的结果。如果一个用户提供整数参数(18)和另一浮点参数(18.0),则即使所有输入的数值均相等,答案也完全不同。
#Conversion of celcius to Fahrendheit in python 2.6 >>> print 18*9/5 + 32 64 >>> print 18.0*9/5 + 32 64.4 >>> 18 == 18.0 True
从上面我们可以看到,当我们通过18.0时,我们得到正确的输出,而当我们通过18时,我们得到不正确的输出。这是因为在python 2.x中,如果所有参数都是整数,则“ /”运算符将作为下限。但是,如果参数之一是浮点值,则“ /”运算符将返回一个浮点值。
显式转换函数(例如float(x))可以帮助防止这种情况。然而,这个想法是为了让python是简单而稀疏的语言,而不会进行密集的转换以覆盖罕见的意外数据类型的情况。从Python 2.2版本开始,添加了新的除法运算符以阐明期望的内容。普通的/运算符将来会返回浮点结果。一个特殊的除法运算符//将返回四舍五入的结果。
>>> # Python 2.7 program to demonstrate the use of "//" for both integers and floating point number >>> print 9//2 4 >>> print -9//2 -5 >>> print 9.0//2 4.0 >>> print -9.0//2 -5.0
在python 3.x中,删除了上述缺陷,并且'/'运算符对整数和浮点参数都进行了浮点除法。
>>> #Conversion of celcius to Fahrendheit in python 3.x >>> #Passing 18 (integer) >>> print (18*9/5 + 32) 64.4 >>> #Passing 18.0(float) >>> print(18.0*9/5 + 32) 64.4
当我们传递+ ve或–ve参数时,也没有区别。
>>> print(9/2) 4.5 >>> print(-9/2) -4.5 >>> print(9.0/2) 4.5 >>> print(-9.0/2) -4.5