4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

python3で切り下げ,切り上げ,四捨五入,だけのためにライブラリをimportしたくない

Posted at

息抜きがてらプログラミングサイトの問題を解いていたのですが, いちいちライブラリをインポートするのが面倒になったので, 簡単な処理はimportせずに書くことでpython力を上げていこうと思い,とりあえず3つだけメモ的に残そうと思います.

環境

  • macOS Mojave 10.14.5
  • Python 3.7.3

対象読者

  • なんとなくライブラリを使いたくない人

切り下げ

色々方法調べたところ,mathライブラリにfloorなるものが存在するそうですが,タイトル通りインポートするのが面倒なので関数を適当に作ります.

floor
>>> floor = lambda x: x//1
>>> floor(6.9)
6.0
>>> floor(6.1)
6.0
>>> floor(6.5)
6.0

関数にする必要あるか?という疑問はおいときます.
これはa//bという演算はよくやると思いますが,aをbで割った時の商(整数まで)を返すのでそれを利用して,1で割って切り下げを行なっています.
好きな桁で切り下げがしたい時は以下のようにすればなんとかなります.

floor
>>> floor = lambda x,y: x//y * y
>>> floor(1220,10)
1220
>>> floor(1222,10)
1220
>>> floor(1229,10)
1220
>>> floor(1229,100)
1200
>>> floor(1229,1000)
1000

切り上げ

こちらもmathライブラリにceilなるものが存在するそうですが,以下同文です.

ceil
>>> ceil = lambda x: x//1 + bool(x%1)
>>> ceil(1.2)
2.0
>>> ceil(1.0)
1.0
>>> ceil(1.9)
2.0
>>> ceil(2.0)
2.0

ここではlambdaの説明は省きますが,その他を説明すると,切り下げ同様x//1で商を計算しています.そしてx%1はxをyで割った時の余りを返すので,bool()でキャストしてあげることで余りが存在する時に1を足すことになります.
これで切り上げが実現できます.
応用編として好きな桁で切り上げは以下のようになります.

ceil
>>> ceil = lambda x,y: (x//y + bool(x%y)) * y
>>> ceil(1222.2,1)
1223.0
>>> ceil(1222.2,10)
1230.0
>>> ceil(1222.2,100)
1300.0
>>> ceil(1222.2,1000)
2000.0

四捨五入

調べたところroundという関数が用意されているようですが,これは偶数への丸めのようで以下のような挙動をします.

round
>>> round(2.4)
2
>>> round(2.5)
2
>>> round(2.6)
3

てことでこれも適当に関数作ってしまいましょう. 

ここで注意事項ですが,下のやり方ではround関数の上書きを行なっています.本記事では既存のroundは不要かつ,わかりやすい関数名にするために上書きしましたが,一般的には推奨されないと思うのでこの方法を使用する際は,他の関数名にすることをオススメします.

round
>>> round = lambda x: x//1 + bool(x%1 >= 0.5)
>>> round(1.0)
1.0
>>> round(1.2)
1.0
>>> round(1.4)
1.0
>>> round(1.5)
2.0
>>> round(1.8)
2.0
>>> round(2.0)
2.0
>>> round(2.5)
3.0

好きな桁数で四捨五入したい時は以下のようになります.

round
>>> round = lambda x,y: (x//y + bool(x%y >= 0.5)) * y
>>> round(5555.5,1)
5556.0
>>> round(5555.5,10)
5560.0
>>> round(5555.5,100)
5600.0
>>> round(5555.5,1000)
6000.0
>>> round(5555.5,10000)
10000.0

まとめ

最近1つの関数を使うためだけにライブラリのインポートを行うことがよくあるので,これからはもっと自力でかけるように日々精進しようと思いながら,またこんなネタ記事レベルを錬成している今日この頃ですね( ̄∀ ̄)

参考記事

Pythonで小数・整数を四捨五入するroundとDecimal.quantize

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?