Pythonである数字を有効桁数で丸めたい。
round関数を用いれば、小数点ある桁で丸められるが、今回は最大桁数から動的に丸めたい
例: 有効数字3桁
0.0012344 -> 0.00123
12344000 -> 12300000
123.44 -> 123
そのための関数を作成した。
関数本体
import math
from typing import Union
InputType = Union(float, int, list["InputType"])
def round_sigdig(val: InputType, sigdig: int) -> InputType:
"""最大桁からある桁数で丸める関数
Args:
val (any):
number or list of number or array of number
数値もしくは数値のlistもしくは数値のarray
sigdig (int):
significant digits
有効桁数
Returns:
any:
number or list (same shape of val)
丸められた数値もしくは入力と同じ形のlist
"""
_sigdig = sigdig - 1
def _round_sigdig(val):
if isinstance(val, list):
return list(map(_round_sigdig, val))
d = int(-(math.floor(math.log10(abs(val)))-_sigdig))
val = round(val, d)
if val >= 10**(_sigdig):
return int(val)
else:
return val
return _round_sigdig(val)
使用例
print(1/7, round_sigdig(1/7, 5))
# 0.14285714285714285 0.14286
こちらの関数はlistに対応している。
array = [0.1, 1/3, math.sqrt(2), 120.3333, 99990000, 239200000, 0.0000000001234, 3, 45.000000000123]
print(array)
print(round_sigdig(array, 3))
# [0.1, 0.3333333333333333, 1.4142135623730951, 120.3333, 99990000, 239200000, 1.234e-10, 3, 45.000000000123]
# [0.1, 0.333, 1.41, 120, 100000000, 239000000, 1.23e-10, 3, 45.0]
もちろん多次元配列でも対応可能
array2 = [
[0.1, 1/3, math.sqrt(2)],
[120.3333, 99990000, 239200000],
[0.0000000001234, 3, 45.000000000123]
]
print(array2)
print(round_sigdig(array2, 5))
# [[0.1, 0.3333333333333333, 1.4142135623730951], [120.3333, 99990000, 239200000], [1.234e-10, 3, 45.000000000123]]
# [[0.1, 0.33333, 1.4142], [120.33, 99990000, 239200000], [1.234e-10, 3, 45.0]]
注意点
有効桁数で丸めたときに整数になる場合はint型にキャスティングしている。
あくまでround関数なので、必ずしも四捨五入ではないことに注意