数値を最も近い整数に丸める 質問する

数値を最も近い整数に丸める 質問する

私は次のように長い浮動小数点数を丸めようとしています:

32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...

math.ceil(x)今のところ成功していません。 、を試しましたがmath.floor(x)(ただし、これは切り上げまたは切り捨てになりますが、これは私が探しているものではありません)、round(x)も機能しませんでした (依然として浮動小数点数です)。

私に何ができるでしょうか?

コード:

for i in widthRange:
    for j in heightRange:
        r, g, b = rgb_im.getpixel((i, j))
        h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
        h = h * 360
        int(round(h))
        print(h)

ベストアンサー1

要約:

round(x)

それを丸めて整数に変換します。

round(h)変数に代入していません。 を呼び出すとround(h)、整数を返しますが、それ以外は何もしません。その行を次のように変更する必要があります。

h = round(h)

新しい値を に割り当てますh


@plowmanがコメントで述べたように、Pythonのはround()通常期待通りには動作しません。これは、数値が変数として格納される方法が、画面に表示される方法と異なることが原因です。たくさんの答えこの動作を説明します。

この問題を回避する1つの方法は、次のように10進数を使用することです。この答え

追加のライブラリを使用せずにこの回答を適切に機能させるには、カスタムの丸め関数を使用すると便利です。私がテストした限りでは、すべての保存の問題を回避できる次の解決策を思いつきました。これは、repr()(NOT str()!) を使用して取得された文字列表現を使用することに基づいています。これはハッキーに見えますが、すべてのケースを解決するために私が見つけた唯一の方法でした。これは Python2 と Python3 の両方で機能します。

def proper_round(num, dec=0):
    num = str(num)[:str(num).index('.')+dec+2]
    if num[-1]>='5':
        return float(num[:-2-(not dec)]+str(int(num[-2-(not dec)])+1))
    return float(num[:-1])

テスト:

>>> print(proper_round(1.0005,3))
1.001
>>> print(proper_round(2.0005,3))
2.001
>>> print(proper_round(3.0005,3))
3.001
>>> print(proper_round(4.0005,3))
4.001
>>> print(proper_round(5.0005,3))
5.001
>>> print(proper_round(1.005,2))
1.01
>>> print(proper_round(2.005,2))
2.01
>>> print(proper_round(3.005,2))
3.01
>>> print(proper_round(4.005,2))
4.01
>>> print(proper_round(5.005,2))
5.01
>>> print(proper_round(1.05,1))
1.1
>>> print(proper_round(2.05,1))
2.1
>>> print(proper_round(3.05,1))
3.1
>>> print(proper_round(4.05,1))
4.1
>>> print(proper_round(5.05,1))
5.1
>>> print(proper_round(1.5))
2.0
>>> print(proper_round(2.5))
3.0
>>> print(proper_round(3.5))
4.0
>>> print(proper_round(4.5))
5.0
>>> print(proper_round(5.5))
6.0
>>> 
>>> print(proper_round(1.000499999999,3))
1.0
>>> print(proper_round(2.000499999999,3))
2.0
>>> print(proper_round(3.000499999999,3))
3.0
>>> print(proper_round(4.000499999999,3))
4.0
>>> print(proper_round(5.000499999999,3))
5.0
>>> print(proper_round(1.00499999999,2))
1.0
>>> print(proper_round(2.00499999999,2))
2.0
>>> print(proper_round(3.00499999999,2))
3.0
>>> print(proper_round(4.00499999999,2))
4.0
>>> print(proper_round(5.00499999999,2))
5.0
>>> print(proper_round(1.0499999999,1))
1.0
>>> print(proper_round(2.0499999999,1))
2.0
>>> print(proper_round(3.0499999999,1))
3.0
>>> print(proper_round(4.0499999999,1))
4.0
>>> print(proper_round(5.0499999999,1))
5.0
>>> print(proper_round(1.499999999))
1.0
>>> print(proper_round(2.499999999))
2.0
>>> print(proper_round(3.499999999))
3.0
>>> print(proper_round(4.499999999))
4.0
>>> print(proper_round(5.499999999))
5.0

最終的に、正しい答えは次のようになります。

# Having proper_round defined as previously stated
h = int(proper_round(h))

テスト:

>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1  # should be 7

ここで注意すべき点は、dec小数点第 2 位が 9 になる可能性があり、dec+1小数点第 2 位が 5 以上の場合、9 は 0 になり、dec-1小数点第 2 位に 1 が繰り上がる必要があることです。

これを考慮すると、次のようになります。

def proper_round(num, dec=0):
    num = str(num)[:str(num).index('.')+dec+2]
    if num[-1]>='5':
      a = num[:-2-(not dec)]       # integer part
      b = int(num[-2-(not dec)])+1 # decimal part
      return float(a)+b**(-dec+1) if a and b == 10 else float(a+str(b))
    return float(num[:-1])

上記の状況ではb = 10、 と は単に連結されa、 のb連結となり、10末尾の 0 は消えます。このバージョンでは、に基づいて、適切な繰り上がりとして、b正しい小数点以下の桁に変換されます。dec

おすすめ記事