Python で小数をパーセント表示にしたい
学習メモです。
lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]
を
['1%', '20.1%', '15.75%', '2.5%', '32.2%', '65%']
としたい。
最初に試したのは
リストを定義して、内包表記でリストの各要素を100倍
>>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65] >>> print [x*100 for x in lst] [1.0, 20.100000000000001, 15.75, 2.5, 32.200000000000003, 65.0]
うわぁぁぁあ
浮動小数点型
そもそも演算前から…
>>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65] >>> print lst [0.01, 0.20100000000000001, 0.1575, 0.025000000000000001, 0.32200000000000001, 0.65000000000000002]
orz
>>> type(lst[1]) <type 'float'>
float は浮動小数点型。んで、この浮動小数点数は2進数の分数として表現されているそうで、0.201 なんかは無限小数になっちゃうんですって。
decimal モジュール
10進数を正確に表現できるそうです。
>>> from decimal import Decimal >>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65] >>> print [Decimal(str(x)) for x in lst] [Decimal('0.01'), Decimal('0.201'), Decimal('0.1575'), Decimal('0.025'), Decimal('0.322'), Decimal('0.65')]
str() よりも repr() の方がいいのかな?? もうちょっと調べなくっちゃ。
ただ、Decimal でも10進数の無限小数となる場合は誤差が生じるそうです。要注意。
結果
文字列フォーマット操作なんかも使って
>>> from decimal import Decimal >>> lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65] >>> print ['%g%%' % y for y in [Decimal(str(x))*Decimal('100') for x in lst]] ['1%', '20.1%', '15.75%', '2.5%', '32.2%', '65%']
できたー