python 中实现真正的四舍五入

round()函数

奇进偶舍,又称为四舍六入五成双规则、银行进位法。

它是一种计数保留法。从统计学的角度,“奇进偶舍”比“四舍五入”更为精确:在大量运算时,因为舍入后的结果有的变大,有的变小,更使舍入后的结果误差均值趋于零。而不是像四舍五入那样逢五就进位,导致结果偏向大数,使得误差产生积累进而产生系统误差。

“奇进偶舍”使测量结果受到舍入误差的影响降到最低。

但是 这样就会间接的影响到我们试图实现四舍五入的操作。
其具体规则为:

四舍:要求保留位数的后一位如果是4,则舍去。例如round(5.214,2)保留两位小数为5.21

六入:如果保留位数的后一位如果是6,则进上去。例如round(5.216,2)保留两位小数为5.22

五成双:如果保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入: 如果是奇数则进入,如果是偶数则舍去。例如5.215保留两位小数为5.22; 5.225保留两位小数为5.22

其实现的并不是我们广义所知的四舍五入

decimal()

python中的数据显示其实是不太精确的,若是这个浮点数数值无法被计算机精确的存储,那么它就会先被转存为一个二进制的值,再转化为等效(53位甚至更多位来保证精度)的十进制值。因此
试图存入1.1时,其实是存入了1.100000000000000088817841970012523233890533447265625
试图存入1.125时,其实是存入了’1.1249999…’

因此先使用decimal将其保留到n为精确的小数,再进行舍入,写法如下

需要引入模块:from decimal import Decimal, ROUND_HALF_UP

a1 = Decimal('1.125').quantize(Decimal('0.00'),rounding=ROUND_HALF_UP)

首先,‘1.125’ 是要进行四舍五入的数字,注意是字符串格式。
后面的字符串 ‘0’,是要控制小数点的位数,‘0’就是取整,'0.0’就是保留一位小数,0.00’就是保留两位小数,依次类推。
注意,上面那个式子返回的结果是Decimal类型

如果是python中对dataframe进行处理的话:

data['high_mid_px'] = data['high_mid_px'].apply(lambda x: self.round_decimal(x))
def round_decimal(self, x):
    if pd.notnull(x):  # 检查是否为空值
        return Decimal(x).quantize(Decimal('0.0000'), rounding=decimal.ROUND_HALF_UP)
    else:
        return x

注:Decimal对空值不是很友好,会影响后续处理,因此在处理列的时候需要将空值设置为默认值或者写个lambda表达式判断是否为空值,不是空值的处理,是空值的则不处理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值