本文所有讨论都是基于python3版本一般我们讨论到控制小数位数,会有以下几种方法:
就会引出python四舍五入规则问题
好多博客在说round做舍入的时候,要看舍入的前一位是奇数还是偶数奇数进位,偶数舍去其实是不准确的。例如:
前两个例子能用上面的“规则”解释1.275的例子又做何解?
洳果你用另外两个控制小数位数的办法就会发现会遇到同样的问题。
decimal如果想正确四舍五入规则得用字符串作为Decimal( )的参数,decimal模块的内容在苐四小节
format有一些比较复杂的用法,详见
问题的根源来自于浮点数的二进制表示和四舍五入规则的策略。
首先是浮点数的二进制表示:
假设 v v v是浮点数的小数部分,那么十进制和二进制的表示分别如下:
python在使用和存储的时候都是用和十进制最接近的数值。例如:
再说回四舍五入规则的基本策略:
做基本的四舍五入规则的时候,都是使用系统内表示的值比如说1.275,系统内表示为1.所以四舍五入规则之后就是1.27;但还囿些能够用二进制表示的小数部分,如果要舍入的那位是5比如说1.125,四舍五入规则保留2位就是1.12(结果的最后一位是偶数)
很明显,因为python保存的值不一定和我们想要的值相同如果设及精度比较高的计算(float表示16位精度),就需要自己写方法或者使用decimal模块
你可以自己写一个函数:
保留的位数可以是负数,正确性待检验
decimal模块为快速正确舍入的十进制浮点运算提供支持。官网介绍的比较详细:
decimal算数上下文可以设置精度和舍入的规则:
默认精度是28默认舍入规则是ROUND_HALF_EVEN。舍入规则一共有8种: