今まで数値のデータ型は整数型と浮動小数点型をやりました。
小数を扱う浮動小数点型は、10進小数での計算は正確に表現できない場合があります。これはPython特有の問題ではなくて、コンピュータ全般の問題です。詳しくは「浮動小数点数型 誤差」でGoogle検索してみて下さい。
1 2 3 |
f = 0.1 + 0.1 + 0.1 - 0.3 print(type(f)) print(f) |
<class ‘float’>
5.551115123125783e-17
0.1 + 0.1 + 0.1 – 0.3 の答えが変な数字になっています。
こういう時は、decimalモジュールを使います。decimalは正確に丸められた十進浮動小数点算術をサポートします。
※モジュールとは、他のプログラムから再利用できるようにしたファイルのことです。読み込んで利用します。
1 2 3 4 5 6 |
from decimal import * d = Decimal("0.1") + Decimal("0.1") + Decimal("0.1") - Decimal("0.3") print(type(d)) print(d) |
<class ‘decimal.Decimal’>
0.0
小数点は文字列にして、Decimalに渡します。
※ floatは演算速度が早い。Decimalは遅いけれど正確。
数学関数
詳しくは https://docs.python.jp/3/library/math.html を参照して下さい。
import math でモジュールを読み込み利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import math i = 4.5 print(type(i)) print(i) # 切り上げ i1 = math.ceil(i) print(type(i1)) print(i1) # 切り捨て i2 = math.floor(i) print(type(i2)) print(i2) |
<class ‘float’>
4.5
<class ‘int’>
5
<class ‘int’>
4
浮動小数点の4.5を切り上げ、切り捨てしています。結果はint整数型で返ります。
四捨五入(ではない)
丸めた先の値が偶数になるように値を丸める関数がroundです。
1 2 3 4 5 |
print(round(3.5)) print(round(4.4)) print(round(4.5)) print(round(4.6)) print(round(5.5)) |
4
4
4
5
6
3.5の四捨五入は4で問題ない。
4.5を四捨五入したら5になるはずですが、偶数になるように4となる。
5.5は四捨五入したら6になり、これは問題ない。
python3のroundは要注意です。
Python 3.6 から導入された「f文字列」
今までformat()メソッドで書いていたものを「f文字列」でより簡潔に書けるようになりました。
接頭辞 ‘f’ または ‘F’ の付いた文字列内に、波括弧 {} を書けます。この波括弧 {} 内は実行時に式として評価されます。
1 2 3 4 |
# こう書いていたものが print('1 + 1 = {}'.format(1+1)) # こう書ける print(F'1 + 1 = {1+1}') |
1 + 1 = 2
1 + 1 = 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 千の位のセパレータにカンマを使用する i = 1234567890 print(f"{i:,}") # 3桁カンマは小数ありでもできる print(f"{1234.5678:,}") # 3桁カンマは少数部分(小数点2桁表示)は丸めるのもできる print(f"{1234.5678:,.2f}") # パーセントを表示(小数点2桁表示)する i = 3 n = 10 print(f"{i/n:.2%}") # 1/3を小数点10桁まで表示 print(f"{1/3:.10f}") # 0埋め print(f"{1:0>4}") |
1,234,567,890
1,234.5678
1,234.57
30.00%
0.3333333333
0001
今回は以上です。