Python数值处理(一)

round()取整

使用round()函数可以轻松的对浮点数进行取整操作。示例如下:

>>> round(1.23, 1)
1.2
>>> round(1.27, 1)
1.3
>>> round(-0.36, 1)
-0.4

round()第二个参数可以是负数:

>>> a = 13849
>>> round(a, -1)
12850
>>> round(a, -2)
13800

但是要注意,这里有两个很奇怪的例子:

>>> round(2.5)
2
>>> round(0.5)
0

clipboard.png

可以发现,这里完全没有按照我们所熟悉的四舍五入的取整规则来。这是因为round()函数在应对这种与两个整数距离相同的情况时,会取到最近的偶数上去。

同时官方文档中还举了一个例子,

Note The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.

round(2.675, 2)的结果居然是2.67,这个的原因是浮点数表示是有误差的,2.675在计算机上实际上不是准确的2.675。

解释一下浮点数问题

首先我们要明确一个概念,计算机只能识别二进制,也就是一堆10的组合,但是人类常用的却是十进制。
十进制的数在计算机里就需要转换成二进制表示,在将十进制整数转为二进制的时候,往往是将原数不断除以2,直到商小于1,将每一次得到的余数逆序排列,就能得到这个整数的二进制表示了。
到了小数部分,我们采用的是乘以2,取整数部分,直到小数部分为0,顺序排列。但是有些特殊的数就要搞事情了。

clipboard.png

0.1 * 2 = 0.2 => 0
0.2 * 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
0.8 * 2 = 1.6 => 1
0.6 * 2 = 1.2 => 1
0.2 * 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
0.8 * 2 = 1.6 => 1
...

发现没有,进入无限循环了,也就是说整数中一些小数,在二进制表示的时候是无限循环小数,但是在计算机中毕竟是用有限位来表示一个值的,这就造成了有些小数(浮点数)在计算机中是被截掉部分的,这就是浮点数不精确的原因啦。

decimal

如果你特别需要精确的数值,那么可以使用decimal模块。当然这是有性能代价的(有得必有失嘛)。
举个例子:

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a+b) == 6.3
False
# 这次试试decimal
>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a+b)
6.3
>>> (a + b) == Decimal('6.3')
True

数值的输出格式化

如果只是想让数值以固定的位数输出,那么是用不着round()的。

>>> a = 1.23456
>>> format(a, '0.2f')
'1.23'
>>> format(a, '0.3f')
'1.234'

欢迎关注个人公众号公子政的宅日常查看更多文章:

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章