2.2 数值
数值型数据类型包括int和float(复数楼主也没用过这里就不讲了),分别是整数和浮点数,一般我们要对数字进行的操作都是计算比较多,比如加减乘除取余幂次方,在编程语言里,+不仅可以用于数值型数据进行计算,还可以用于其他数据类型的拼接、扩展,比如之前提到的字符串的拼接,后面我们还会看到+用于数组的扩展,但是-*/%**这些就只能用于数值型数据了,运算数中只要有一个是float,结果就会返回float,运算数只有int的时候才会返回int。
基本运算符
+ 加 add
- 减 subtract
* 乘 multiply
/ 除 divide
% 取余数 mod
// 整除,实际上应该翻译为地板除, floor division
** 幂, exponents 也可以用pow函数
示例代码:
>>> 1*9+(2**3-7+1.2/5)
10.24
>>> 10//3
3
>>> 10%3
1
>>> 10/3
3.3333333333333335
其他内置的数学函数:
abs(number) absolute返回number的绝对值,
divmod(x,y) 返回一个元组(x//y,x%y),也就是一个函数返回 divide+mod 的结果
pow(x,y) 返回x的y次方,同x**y
示例代码:
>>> abs(-1)
1
>>> divmod(10,3)
(3, 1)
>>> pow(2,6)
64
关于浮点数,有个地方需要注意的,上面的例子中10/3的结果应该是一个无限循环小数,就算四舍五入也不应该会出现一个5的小数,但是python返回了3.3333333333333335,我们可以通过格式化看看,python实际上给我们计算出了什么结果,“%.18f” % number 可以让python返回number的18位小数,效果如下,我们可以看到,python在输出了16个3之后,开始出错了:
>>> "%.18f" % (10/3)
'3.333333333333333481'
python的浮点数精度是16, 我们可以简单地理解为,浮点数的运算结果只有前16个数是正确的 ,让我们再看看100/3,1000/3,10**17/3,还有著名的0.1+0.2:
>>> "%.18f" % (1000/3)
'333.333333333333314386'
>>> "%.18f" % (100/3)
'33.333333333333335702'
>>> "%.18f" % (10**17/3)
'33333333333333332.000000000000000000'
>>> "%.18f" % (0.1+0.2)
'0.300000000000000044'
在你的python shell 上敲一敲,用len来数一数,看看是不是只有前16个数字是准确的(对于浮点数精度丢失原因感兴趣的姐妹,可以看看篇末的链接):
>>> num1 = ("%.18f" % (1000/3)).replace(".","")
>>> (num1[:16],num1[16:])
('3333333333333333', '14386')
虽然在16个数字之后会有精度丢失,但是如果你对小数点的精度要求不高,仍然不影响使用,使用round函数保留指定小数点即可,语法是round(number, prec):
>>> round(10/3,10)
3.3333333333
如果有高精度要求,可以使用python的decimal模块,这个是标准库,默认会安装,用法就是import decimal模块后,调用decimal.Decimal把运算数转化为高精度的浮点数再进行计算(注意是提高运算数的精度,不要计算完再提高结果的精度,那是无效的),其他运算同理。
decimal模块的精度是可以设置的,默认是28,可以修改decimal.getcontext().prec的值来设置,这里的prec,是precision的缩写。
示例代码如下:
import decimal
# 高精度的小数计算,默认精度28位
prec28 = decimal.Decimal(10)/3
# 修改精度=64,精确到小数点后63位
decimal.getcontext().prec = 64
prec64 = decimal.Decimal(10)/3
关于数值型数据,还有一个常用的math模块,它有三角函数、对数函数,覆盖范围更广,如果要进行复杂的计算,还需要调用math模块。
>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
这里的dir函数和help函数类似,会返回模块的信息,但是不会返回详细内容,我们可以通过这个函数快速浏览一遍模块的函数,然后从里面选择你需要的,再用help来看这个函数的具体语法。
math模块有2个常量,pi和e,pi就是π、圆周率,e就是自然底数,调用语法是 math.pi和math.e,math模块的使用示例如下:
>>> π = math.pi
>>> π
3.141592653589793
>>> math.sin(π/2)
1.0
>>> math.cos(π)
-1.0
>>> e = math.e
>>> e
2.718281828459045
>>> math.log(2**8,2)
8.0
>>> math.log10(10**3)
3.0
>>> math.log1p(e**4)
4.0181499279178094
姐妹们也来动手敲一敲其他函数吧
tips: