見出し画像

四捨五入とroundの罠(ABC274A)

お久しぶりです。Koです。
久々にAtCoderをやったらA問題から難しくて自分の実力の衰えに愕然としました。20分近くかかってしまった…
あとうっかり遅刻したせいでUnratedになり、今回のレートがわからない。悲しい。

今回の問題。

要するに割り算の小数第4桁で四捨五入したものを返せば解決です。

悪例(roundを使った場合)

#悪例
A,B=map(int,input().split())
print(round(B/A),3)

ここでround使いたいんですが、WAになります。

どうやら浮動小数点(float)の処理が難しいらしく、正確に丸められないことがあるらしいです。(詳細知りたい方はこちらで。python公式サイトです。)

というわけで、今回はDecimalを使いました。

私の解答(Decimal使用)

from decimal import Decimal,ROUND_HALF_UP
A,B=map(int,input().split())
print(Decimal(B/A).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP))

本番は使い方がわからなかったのでどこかからコピペしちゃいましたが、ちゃんと解説書こうと思います。

Decimalの使い方

まず、Decimalというのはオブジェクトの名前です。floatとかと同じ部類。
Decimal(整数or小数)というように()の中に名前を入れて使います。
わざわざDecimalの中身をstrに変換しなくていいっぽいです(AC確認済み)

次にquantizeについて。
Decimal().quantize()というように続けて書きます。
quantize(丸めた後の桁数、丸めかた)という感じです。

まず桁数。
ここではDecimal(‘0.001’)というように指定を入れましたが、(‘1.000’)という書き方でもいいらしいです。桁数合っていればOK。ただし‘’をつけないとREが返ってきます。

次に丸めかた。
roundingという引数に続けて丸めかたを指定します。
ROUND_HALF_UPがいわゆる四捨五入。半分以上は上にまとめます。
他で重要そうなのが
ROUND_CEILING (切り上げ)
ROUND_FLOOR(切り捨て)
という感じです。
ちなみにこれは予めimportの段階でDecimalと一緒に入れないといけないっぽいです。
(contextという項目で予め設定しておけば毎回これを指定しなくていいみたいでしたが設定方法がよくわかりませんでした…)

すっごく詳しく書かれているのはこちら。

まとめ

Decimalは正確な計算をするのに必要だけどimportが必要。
丸めかたを指定するときはimportで丸めかたも指定する

#四捨五入
from decimal import Decimal,ROUND_HALF_UP
Decimal(整数or小数).quantize(Decimal(‘桁数指定’,rounding=ROUND_HALF_UP))

この記事が気に入ったらサポートをしてみませんか?