与えられた数値を、2、5、6、または 0 に最も近い 100 位でその値を見つけたいと考えています。
これを行う丸め関数はありますか、またはプログラムでどのように行うのですか?
たとえば、2.567 は 2.566、2.5652 は 2.565、2.5613 は 2.562 になります。
与えられた数値を、2、5、6、または 0 に最も近い 100 位でその値を見つけたいと考えています。
これを行う丸め関数はありますか、またはプログラムでどのように行うのですか?
たとえば、2.567 は 2.566、2.5652 は 2.565、2.5613 は 2.562 になります。
Python ドキュメントと呼ばれるものがあります。
round(数値[, n桁] )
小数点以下 ndigits 桁に丸められた浮動小数点数を返します。ndigits を省略すると、デフォルトでゼロになります。結果は浮動小数点数です。値は、10 の累乗から n 桁を引いた最も近い倍数に丸められます。2 つの倍数が等しく近い場合、丸めは 0 から離れて行われます (たとえば、round(0.5) は 1.0 で、round(-0.5) は -1.0)。
注 float に対する round() の動作は驚くべきものです。たとえば、round(2.675, 2) は、予想される 2.68 ではなく 2.67 を返します。これはバグではありません。これは、ほとんどの小数が float として正確に表現できないという事実の結果です。詳細については、浮動小数点演算: 問題と制限を参照してください。
したがって、丸めは次のように単純になります。
print round(2.235, 2)
# Output: 2.24
ここから、2、5、6、0 から 100 分の 1 が最も近い距離を測定する簡単なコードを書くことができます。
あなたの質問は非常に不明確ですが、うまくいけば、次のようなことが正しい方向に向かうでしょう:
vals = [ 0, 2, 5, 6 ]
number = 4.296
distances = [ abs(x - number) for x in vals]
closest = vals[distances.index(min(distances))]
これにより、リスト内の最も近い値が取得されますnumber
。
100 番目の桁から始まる小数部分を分離するには、num
10 を掛けてから、小数部分から全体を分離することで を増やすことができます。たとえば、3.14159 は 31.4159 になり、整数部分は 31 になり、小数部分は 0.4159 になります。
bisect.bisect
これで、小数部分に最も近い数字 (0、2、5、または 6 など) を選択するために使用できます。
import bisect
def closest_hundredth(num, digits=[0, 2, 5, 6]):
digits = [d/10.0 for d in digits] + [1.0]
num *= 10
whole = int(num)
frac = num-whole
boundary_vals = [(digits[i]+digits[i+1])/2 for i in range(len(digits)-1)]
idx = bisect.bisect(boundary_vals, frac)
rounded_frac = digits[idx]
new_num = whole + rounded_frac
new_num /= 10
return new_num
tests = [
(3.14159, 3.15),
(3.156, 3.16),
(3.13159, 3.12),
(0, 0),
(0.01, 0.02),
(0.011, 0.02),
(0.08, 0.10)
]
for num, answer in tests:
result = closest_hundredth(num)
assert result == answer
bisect.bisect
選択肢が 4 つしかないため、ここで使用するのはやり過ぎかもしれません。if ステートメントの方が速いかもしれません。しかし、面倒な if 文を書かなくてもアイデアを表現できる読みやすい方法だと思います。また、選択する境界値が多数ある場合、( のO(log(n))
代わりに複雑さを使用O(n)
して) 適切にスケーリングします。if-statements