pythonで小数部の桁数を制限する場合、decimalを使うのが一般的だそうだ。
decimalは有効桁数を制御できるけど、JavaのBigDecimal#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]
小数部がたりない場合は省略します。