Python3【 round関数】四捨五入がうまくいかない。

Python Python
※横にスクロールします。


Python2では、round関数を使えばふつうに四捨五入ができるらしいが、
Python3へのバージョンアップで、round関数の仕様に変更があったらしく,


>>>round(2.5)
2

>>>round(2.51)
>>>round(2.500001)

↑の場合は、普通に
3
となる。
どうやら境界値はここにあるらしい。

これを解消する方法としては、関数を定義しなおせばよい。


round = lambda x:int((x*2+1)/2)

と、Python風にlambda構文を使うと1行で書ける。

上記のコードを入力後ならば、


>>>round(2.5)
3.0

となる。
(この場合のroundはlambdaを使って関数オブジェクトを
roundという変数に格納しているので、roundでなくてもよい。)



round関数を使い、位を指定し四捨五入


pi = 3.14159265 #piに代入
round(pi,2) #2番目の引数に小数点以下の表示させたい位を入力
print(pi) #3.14と出力
round(pi,7)
print(pi) #3.1415927と出力←少数点以下8桁目でroundされている

小数点以下の場合は、偶数に近い場合の5でも、
普通に四捨五入になりました。
(※ちなみに先ほどのlambda構文でroundを定義してしまっていると第二引数は使えなくなってしまうので注意!)


fuji = 3776
round(fuji,-2) #マイナスにすれば、整数の位で調整できる。
print(fuji) #3800と出力される

x = 25
round(x,-1)
print(x)
 #20と出力される。

整数の位で四捨五入した場合はやはり,
偶数が近かった場合の5は切り捨てになってしまう。

python.jpのドキュメントより引用。

【round(number[, ndigits])】
number を小数点以下 ndigits 桁に丸めた浮動小数点数の値を返します。 ndigits が省略されたかもしくは None だった場合、入力に最近接の整数を返します。 number.__round__(ndigits) に処理を委譲します。round() をサポートする組み込み型では、値は 10 のマイナス ndigits 乗の倍数の中で最も近いものに丸められます; 二つの倍数が同じだけ近いなら、偶数を選ぶ方に (例えば round(0.5) と round(-0.5) は両方とも 0 に、 round(1.5) は 2 に) 丸められます。返り値は 1 引数で呼ばれたなら整数、そうでなければ number と同じ型です。注釈 浮動小数点数に対する round() の振る舞いは意外なものかもしれません: 例えば、 round(2.675, 2) は予想通りの 2.68 ではなく 2.67 を与えます。これはバグではありません: これはほとんどの小数が浮動小数点数で正確に表せないことの結果です。詳しくは 浮動小数点演算、その問題と制限 を参照してください。

 

えっ!?


>>>round(2.675, 2)
2.67

になってしまうの‥
ややこしいですね‥

【mathモジュール】ceil floor 切上げ 切下げ

 

【ceil()】【floor】は四捨五入ではなく、数値の切上げと切下げ(切捨て)。
消費税などは一般的には小数点以下切捨てですね。
(税法上は定まっていないらしいですが。)

切上げ、切下げも四捨五入と同じく、
Python標準ライブラリーにあるmathモジュールを使っていきたいと思います。

>>>import math #mathをインポート

>>>x = 105.84 #変数に代入
>>>math.floor(x)
105      #切下げ成功

>>>math.ceil(x)
106          #切上げ成功

ceil floor はあくまで整数を返すようで位は指定できませんでした。



コメント