Python中round函数使用谨慎事项
发布时间:2021-12-05 13:18:09 所属栏目:教程 来源:互联网
导读:使用round函数的时候发现了一个奇怪的现象。一直觉得round函数是一个用于四舍五入的函数,结果却不一定。一般如果觉得奇怪,那就是没弄懂其本质的运作原理,所以深入了解了下round函数。 Python版本问题 Python2和Python3有很多实现细节上的不同,round函数
使用round函数的时候发现了一个奇怪的现象。一直觉得round函数是一个用于四舍五入的函数,结果却不一定。一般如果觉得奇怪,那就是没弄懂其本质的运作原理,所以深入了解了下round函数。 Python版本问题 Python2和Python3有很多实现细节上的不同,round函数是其中不同之一。在Python3中,round(1.0/2.0)得到的是1,而在Python2中,round(1.0/2.0)得到的是0 貌似Python2之间的不同版本也不同。 Python 2.7: >>> round(10/3, 2) 3.0 >>> round(0.5) 1.0 >>> round(-0.5) -1.0 >>> round(1.5) 2.0 如图: Python中round函数使用注意事项 Python 2.7中:保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。 Python 3.6: >>> round(10/3, 2) 3.33 >>> round(0.5) 0 >>> round(-0.5) 0 >>> round(1.5) 2 >>> round(3.5, 2) 3.5 # 不是3.50 如下图: Python中round函数使用注意事项 Python 3中:如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。 注意上面的对比结果,小数位的位数也有区别的! 计算机表示精度的影响 round函数对于返回的浮点数并不是按照四舍五入的规则来计算,而受收到计算机表示精度的影响。 浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学运算也会产生小的误差,比如: >>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> a + b == 6.3 False Python中round函数使用注意事项 Python 2.7 和 3.6: >>> round(1.675, 2) 1.68 >>> round(2.675, 2) 2.67 Python中round函数使用注意事项 不论我们从python2还是3来看,结果都应该是2.68的,结果它偏偏是2.67,为什么?这跟浮点数的精度有关。我们知道在机器中浮点数不一定能精确表达,因为换算成一串1和0后可能是无限位数的,机器已经做出了截断处理。那么在机器中保存的2.675这个数字就比实际数字要小那么一点点。这一点点就导致了它离2.67要更近一点点,所以保留两位小数时就近似到了2.67。 综上,利用round函数来实现四舍五入和小数位保留,结果可能不是预期的,如果对四舍五入和小数位精度要求高,避免使用round函数。较好的解决方案可以使用decimal模块。 >>> from decimal import Decimal >>> a = Decimal('4.2') >>> b = Decimal('2.1') >>> a + b Decimal('6.3') >>> a + b == Decimal('6.3') True Python中round函数使用注意事项 >>> from decimal import Decimal >>> d = Decimal(2.675) # 如果Decimal参数是浮点数 默认还是会截断 >>> d.quantize(Decimal('0.00')) Decimal('2.67') >>> d = Decimal('2.675') # 用字符串就可以做到正常的四舍五入和精确的精度 >>> d.quantize(Decimal('0.00')) Decimal('2.68') >>> d = Decimal(3.5) >>> d.quantize(Decimal('0.00')) Decimal('3.50') >>> d = Decimal('3.5') >>> d.quantize(Decimal('0.00')) Decimal('3.50') Python中round函数使用注意事项 >>> from decimal import Decimal, ROUND_UP >>> n = Decimal('0.0000416') >>> n.quantize(Decimal('0.01')) Decimal('0.00') >>> n.quantize(Decimal('0.01'), rounding=ROUND_UP) # 保证最小是0.01 Decimal('0.01') Python中round函数使用注意事项 要处理更精确的分数精度,可以使用fractions模块的Fraction类。 ![]() (编辑:宿州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐