浮点数运算
如果直接进行浮点数运算,则可能会产生下列后果:
>>> x=2.1
>>> y=4.03
>>> x+y
6.130000000000001
这是因为计算机需要将十进制转化为二进制进行存储,而小数点后的数对于二进制来说是无限循环,而python是以双精度(64)位来保存浮点数,多余的位会被截掉,所以在计算时会产生误差。
方法一 round
>>> round(12.12345,3)
12.123
>>> round(12.023+1.63013,2)
13.65
>>> round(12.000003,3)
12.0
上述方法在python2下,“Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0.” 保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。
但在python3下,“values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice.” 如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。
总的来说,一般情况下四舍五入,当取到x.5时,python2的取法是取离0远的一端,python3的取法是取偶数。
但是,round(2.675, 2) 的结果,不论我们从python2还是3来看,结果都应该是2.68的,结果它偏偏是2.67,因为计算机在存储2.675时有误差,导致这个数实际上比2.675小,自然也就更偏向于2.67,四舍五入后也就得到2.67.
方法二 math
使用前导入math
import math
然后向上取整ceil:
>>> math.ceil(2.1)
3.0
>>> math.ceil(2.6)
3.0
>>> math.ceil(2.00001)
3.0
>>> math.ceil(2.50000)
向下取整是math.floor
方法三 decimal
>>> from decimal import Decimal
>>> from decimal import getcontext
>>> d=getcontext() # 获取当前环境
>>> d.prec = 6 # 设置精度
>>> print d #可以查看环境属性
Context(prec=6, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[DivisionByZero, Overflow, InvalidOperation])
>>> c = Decimal(1)/Decimal(3)
>>> print c
0.333333 # 6位精度
逻辑运算
- 符号
- x and y:x非0时,返回y的值,x为0,输出False
- x or y: x非0,返回x,x为0,返回y
- not x:返回True 或 False
- 实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = 10
b = 20
if a and b :
print "1 - 变量 a 和 b 都为 true"
else:
print "1 - 变量 a 和 b 有一个不为 true"
if a or b :
print "2 - 变量 a 和 b 都为 true,或其中一个变量为 true"
else:
print "2 - 变量 a 和 b 都不为 true"
# 修改变量 a 的值
a = 0
if a and b :
print "3 - 变量 a 和 b 都为 true"
else:
print "3 - 变量 a 和 b 有一个不为 true"
if a or b :
print "4 - 变量 a 和 b 都为 true,或其中一个变量为 true"
else:
print "4 - 变量 a 和 b 都不为 true"
if not( a and b ):
print "5 - 变量 a 和 b 都为 false,或其中一个变量为 false"
else:
print "5 - 变量 a 和 b 都为 true"