使用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
可是要注意,这里有两个很奇怪的例子:spa
>>> round(2.5) 2 >>> round(0.5) 0
能够发现,这里彻底没有按照咱们所熟悉的四舍五入的取整规则来。这是由于round()
函数在应对这种与两个整数距离相同的状况时,会取到最近的偶数上去。code
同时官方文档中还举了一个例子,orm
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。ip
首先咱们要明确一个概念,计算机只能识别二进制,也就是一堆1
和0
的组合,可是人类经常使用的倒是十进制。
十进制的数在计算机里就须要转换成二进制表示,在将十进制整数转为二进制的时候,每每是将原数不断除以2,直到商小于1,将每一次获得的余数逆序排列,就能获得这个整数的二进制表示了。
到了小数部分,咱们采用的是乘以2,取整数部分,直到小数部分为0,顺序排列。可是有些特殊的数就要搞事情了。ci
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
模块。固然这是有性能代价的(有得必有失嘛)。
举个例子:it
>>> 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()
的。io
>>> a = 1.23456 >>> format(a, '0.2f') '1.23' >>> format(a, '0.3f') '1.234'
欢迎关注我的公众号公子政的宅平常查看更多文章: