元派遣プログラマの自称技術系ブログです。雑記とか自作のオープンソースプロジェクトの話とか。
Javaとか組込とかできます。お仕事ください。

Pythonでいいかんじに 小数部の桁数を制限する

pythonで小数部の桁数を制限する場合、decimalを使うのが一般的だそうだ。
decimalは有効桁数を制御できるけど、JavaBigDecimal#setScaleのように小数点以下の桁数を制限する機能がなかった。

そんなわけでいい感じに 小数部を成型してくれる関数を作った。

from decimal import Decimal,getcontext,ROUND_HALF_UP
def floatScale(v:float,n:int,rounding=ROUND_HALF_UP,max_decimal:int=None)->float or int:
    """
    いい感じに小数点桁数を制限する
    Params
        v   成型する値
        n   小数点桁数
        rounding    誤差の取り扱いルール
        max_decimal 一時的に変更する値全体の有効桁数
    """
    assert(n>=0)
    old=None
    try:
        if max_decimal is not None:
            getcontext().prec=max_decimal
        return float(Decimal(v).quantize(Decimal("1e-%d"%(n)), rounding=rounding)) if n>0 else int(Decimal(v).quantize(Decimal("0"), rounding=rounding))
    finally:
        if old is not None:
            getcontext().prec=old

実行結果

[floatScale(12.3456789,i) for i in range(0,13)]
[12,
 12.3,
 12.35,
 12.346,
 12.3457,
 12.34568,
 12.345679,
 12.3456789,
 12.3456789,
 12.3456789,
 12.3456789,
 12.3456789,
 12.3456789]

小数部がたりない場合は省略します。