いっぽんの猟銃のむこうに (DAIZOじいさんとGun)

ヌルめの技術メモとか。フリーランスやってます (http://acez.jp/)

特定桁数での丸め込み(切り上げ、切り捨て)する

切り上げとか切り捨てってJavaならMath.floor()とかMath.ceil()だよね?と思ってたんだけど、該当メソッドは小数点以下の切り捨てしかしてくれないことを今更。そういやそうでした。

たとえば時間計算とかでありがちな、出勤は15分単位で切り上げ、退勤は15分単位切り下げとか(9:02〜18:08なら09:15〜18:00)したい場合、どうするんだっけ? って一瞬悩んでひたすらdatetime型のAPI探したりしてしまったのでメモ。

特定桁数で丸め込みしたい場合、割ったものに掛ければいい。

Pythonで書くと下のような感じ。

marume.py

# 切り捨て
def floor(src, range):
    return (int)(src / range) * range

# 切り上げ
def ceil(src, range):
    return ((int)(src / range) + 1 ) * range

実行するとこんな感じ。

>>> import marume
>>> marume.floor(19, 10)
10
>>> marume.floor(21, 10)
20
>>> marume.ceil(19, 10)
20
>>> marume.ceil(21, 10)
30

時間計算で使う場合は分とか秒とかで単位をあわせる。

>>> marume.ceil((9*60 + 2), 15)
555 
(-> 9:15)
>>> marume.floor((18*60 + 8), 15)
1080
(-> 18:00)

ロジック的には基本中の基本……ですよね……
これくらいパッと出てこないのは最近あんまコード書いてないからかなー。いかんなあー