天天看點

關于四舍五入的一點思考

思考來源:做時間的四舍五入。例如将時間近似到最近的半小時,如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函數是按照規則進行計算,而資料的存儲則導緻計算錯誤。