python浮点数四舍五入的问题的分析

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值