关于四舍五入的一点思考

思考来源:做时间的四舍五入。例如将时间近似到最近的半小时,如10:20近似到10:30,10:10分近似到10:00。
常规做法,查,查到了将dataframe中的时间使用round近似。代码如下:

import pandas as pd

df = pd.DataFrame([{'old_column':pd.Timestamp('2015-07-18 13:53:33.280')}])
df['new_column'] = df['old_column'].dt.round('30min')

然后思考如果使用常规方式应该如何进行近似。
经历了艰难的思想斗争后,去了趟厕所,还是没想出来。。。不过路上根据另外的代码看到了取余
回到座位,起身转了转,想到四舍五入和取余的相关性。简单概括就是加上某个粒度后,计算有多少个粒度,再用个数乘以粒度即可。

  • 2:53按30分钟为粒度进行取整
  • 先转换为173分钟,然后除以30取整得到5,取余的23
    • 思路重点在剩下转换23分,将23分加上30(因为是按照30进行进位)后,进行地板除(//)30后转整数为1,将1加上前面的5,之后乘以30调整量纲后的到所有答案。

**以上是关于四舍五入和取余的思考,以下是关于浮点数round函数使用“银行家式舍入法”(“四舍六入五平分”)的问题总结。
问题来源:存储浮点数的计算机存储方式,导致四舍六入,在五的时候进行平分策略,

print(round(2.675, 2))
# >>>2.67

造成这种现象的原因是浮点数存储的问题,如下:

from decimal import Decimal
print(Decimal(2.665))
# >>>2.66500000000000003552713678800500929355621337890625

print(Decimal(2.675))
# >>>2.67499999999999982236431605997495353221893310546875

round函数是按照规则进行计算,而数据的存储则导致计算错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值