-3

与えられた数値を、2、5、6、または 0 に最も近い 100 位でその値を見つけたいと考えています。

これを行う丸め関数はありますか、またはプログラムでどのように行うのですか?

たとえば、2.567 は 2.566、2.5652 は 2.565、2.5613 は 2.562 になります。

4

3 に答える 3

2

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 が最も近い距離を測定する簡単なコードを書くことができます。

http://docs.python.org/2/library/functions.html#round

于 2013-08-16T20:42:40.127 に答える
1

あなたの質問は非常に不明確ですが、うまくいけば、次のようなことが正しい方向に向かうでしょう:

vals   = [ 0, 2, 5, 6 ]
number = 4.296

distances = [ abs(x - number) for x in vals]
closest   = vals[distances.index(min(distances))]

これにより、リスト内の最も近い値が取得されますnumber

于 2013-08-16T20:41:27.370 に答える
0

100 番目の桁から始まる小数部分を分離するには、num10 を掛けてから、小数部分から全体を分離することで を増やすことができます。たとえば、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

于 2013-08-16T21:11:35.800 に答える