python中round做四舍五入要说清楚并不容易。有一种奇进偶舍的说法并不准确。
下面的例子就无法用奇进偶舍来解释:
print(round(1.275,2))
1.27
原因分析
float采用二进制编码描述浮点数。在二进制表示中,大多数有限位十进制小数无法使用有限位二进制进行精确表示。也就是说,有限位数的十进制小数,往往会变为无限位数的二进制小数。
对不能使用有限位二进制小数表示的十进制有限位小数,在系统中存储的是这些十进制浮点数的近似值。在近似值中,分为进位和截断两种类型,近似误差一般在10e−17 左右。进位近似值大于原值,截断近似值小于原值。
表示为二进制近似值后,Python系统在进行round计算时,使用近似值,不是使用原值。
python在存储浮点数的时候,都是用和十进制最接近的数值。例如:
>>> format(1.275,'.20f')
'1.27499999999999991118'
再说回四舍五入的基本策略:
靠近最近(四舍六入);
距离相同时,保证最后一位是偶数;
做基本的四舍五入的时候,都是使用系统内表示的值,比如说1.275,系统内表示为1.27499999999999991118,所以四舍五入之后就是1.27;
对于能够用有限位二进制表示的有限位数的十进制小数,如果要舍入的那位是5,比如说1.125,四舍五入保留2位就是1.12(结果的最后一位是偶数)。
1.12500000000000000000
1.12
1.37500000000000000000
1.38