python cookbook 3 数字 日期 时间(1)

本文深入探讨Python中的数值运算,包括数字舍入、十进制运算精确度、格式化输出技巧以及二进制、八进制、十六进制整数的表示与转换。重点介绍了如何使用decimal模块实现精确的十进制运算,以及如何避免浮点数运算带来的精度损失。同时,文章详细阐述了格式化输出单个数字的方法,包括保留小数位数、控制宽度和使用逗号分隔符等。此外,还介绍了二八十六进制整数的表示方式以及如何使用format()函数进行进制转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




转载于:https://my.oschina.net/u/1409733/blog/489638

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值