Hatena::ブログ(Diary)

何にしても生っかじりの朴念仁

2010-09-13

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%']

できたー

参考

ichhiichhi 2010/09/14 00:46 >>> print [str(f * 100.0) + '%' for f in lst]
['1.0%', '20.1%', '15.75%', '2.5%', '32.2%', '65.0%']

なんてどうでしょうか?
'n.0%'はご愛嬌で

ino46ino46 2010/09/14 00:57 あっ、この程度だと Decimal は必要無かったですね… どうもです。

>>> print ['%g%%' % (x*100) for x in lst]
['1%', '20.1%', '15.75%', '2.5%', '32.2%', '65%']

ichhiichhi 2010/09/14 10:38 おお 'n.0%'が消えてる!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ino46/20100913/1284389938
リンク元