1.数字的舍入
>>> round(1.23,1)
1.2
当一个值刚好在两个边界的中间的时候,round
函数返回离它最近的偶数。仅在python3中如此
python3
>>> round(1.5)
2
>>> round(2.5)
2
--------------------------------------------
python2
>>> round(1.5)
2.0
>>> round(2.5)
3.0
2.执行精确地十进制运算
浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学运算也会产生小的误差,比如:
>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征。 由于Python的浮点数据类型使用底层表示存储数据,因此你没办法去避免这样的误差。
如果你想更加精确(并能容忍一定的性能损耗),你可以使用decimal模块:
>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a+bDecimal('6.3')
>>> a+b== Decimal('6.3')
True
decimal模块的一个主要特征是允许你控制计算的每一方面,包括数字位数和四舍五入运算
decimal.localcontext([c])
返回上下文管理器会将活动线程的当前上下文设置为c的复印件在 with 语句进入和退出 with 语句时恢复以前的上下文。如果指定了没有上下文,则使用当前上下文的副本。
>>> from decimal import localcontext
>>> a= Decimal('1.3')
>>> b= Decimal('1.7')
>>> a/bDecimal('0.7647058823529411764705882353')
>>> print a/b0.7647058823529411764705882353
>>> with localcontext() as ctx:
... ctx.prec = 3
... print a/b
...
0.765
math.fsum(iterable)在可迭代中返回值的准确浮动点总和。通过跟踪多个中间部分款项,避免了精度损失
>>> nums = [1.23e+18, 1, -1.23e+18]
>>> sum(nums)
#注意1消失了
0.0
上述错误可以利用 math.fsum() 所提供的更精确计算能力来解决
>>> import math
>>> math.fsum(nums)
1.0
3. 数字的格式化输出
格式化输出单个数字的时候,可以使用内置的 format()
函数
>>> x = 1234.56789
#保留两位小数
>>> format(x, '0.2f')
'1234.57'
#占10个字符,靠右,保留一位小数
>>> format(x, '>10.1f')
' 1234.6'
#逗号分隔
>>> format(x, ',')
'1,234.56789'
>>> format(x, '0,.1f')
'1,234.6'
#指数记法,将f改成e或者E(取决于指数输出的大小写形式)
>>> format(x, 'e')
'1.234568e+03'
>>> format(x, '0.2E')
'1.23E+03'
同时指定宽度和精度的一般形式是 '[<>^]?width[,]?(.digits)?'
, 其中 width
和 digits
为整数,?代表可选部分。 同样的格式也被用在字符串的 format()
方法中。
>>> x = 1234.56789
>>> 'The value is {:0,.2f}'.format(x)
'The value is 1,234.57'
当用format指定数字的位数后,结果值会根据 round()
函数同样的规则进行四舍五入后返回。
>>> x=1234.56789
>>> format(x, '0.1f')
'1234.6'
>>> format(-x, '0.1f')
'-1234.6'
4.二八十六进制整数
>>> x = 1234
>>> bin(x)
'0b10011010010'
>>> oct(x)
'0o2322'
>>> hex(x)
'0x4d2'
如果你不想输出 0b , 0o 或者 0x 的前缀的话,可以使用 format() 函数
>>> format(x, 'b')
'10011010010'
>>> format(x, 'o')
'2322'
>>> format(x, 'x')
'4d2'
为了以不同的进制转换整数字符串,简单的使用带有进制的int()函数即可:
>>> int('4d2', 16)
1234
>>> int('10011010010', 2)
1234