浮動小数点数を特定の小数点以下の桁数に切り上げる方法は?


83

があり8.8333333333333339、それをに変換したいとし8.84ます。Pythonでこれをどのように達成できますか?

round(8.8333333333333339, 2)与えません。私はPythonやプログラミング全般に不慣れです。8.838.84

文字列として出力したくないので、結果をさらに使用します。この問題の詳細については、Tim WilsonのPythonプログラミングのヒント:ローンと支払いの計算機を確認してください。


4
round(8.8333333333333339、2)は8.83を与えることは決してないようです。
VGE 2010

42
なぜ8.84?8.8333333 ...小数点以下2桁を目指す場合は、8.83に丸める必要があります。
Tim Pietzcker 2010


1
値を出力する場合は、print "%.2f"%8.8333333333333339などの形式を使用します。これにより、値が2桁で出力されます
VGE 2010

タイトルを編集したのは、これが「python round float」の初期の結果として出てきたためであり、おそらくほとんどの人が探しているものではないでしょう。うまくいけば、新しいタイトルが物事をより明確にするでしょう。
jpmc26 2017年

回答:


100

8.833333333339(または8.833333333333334、の結果106.00/12)は、小数点以下2桁に適切に丸められます8.83。数学的には、必要なのは天井関数のように聞こえます。Pythonのmathモジュールにあるものの名​​前はceil次のとおりです。

import math

v = 8.8333333333333339
print(math.ceil(v*100)/100)  # -> 8.84

それぞれ、床関数と天井関数は通常、実数を小数点以下0桁の前後の最大の整数にマップします。したがって、小数点以下2桁に使用するには、最初に数値に10 2(または100)を掛けて小数点をシフトします。ポイントし、その後それで除算して補正します。

math何らかの理由でモジュールを使用したくない場合は、私が書いたこの(最小限のテスト済み)実装を使用できます。

def ceiling(x):
    n = int(x)
    return n if n-1 < x <= n else n+1

これがリンクされたローンと支払い計算機の問題にどのように適用されるか

ローン計算機の出力のスクリーンショット

サンプル出力から、彼らは毎月の支払いを切り上げたように見えます。これは多くの人が天井関数の効果と呼んでいます。この手段は、毎月少し超えることを1 / 12総量のが支払われています。そのため、最終的な支払いは通常より少し少なくなり、未払いの残高はわずかになりました8.76

通常の丸めを使用して、月々の支払い8.83とわずかに高い最終的な支払いを生成することも同様に有効でした8.87。ただし、現実の世界では、一般的に人々は支払いを増やすことを好まないため、各支払いを切り上げるのが一般的な方法です。また、より迅速に貸し手にお金を返します。


67

1/3を10進数で正確に表すことができないのと同じように、8.83をバイナリフロートとして正確に表すことができないため、これは正常です(Pythonとは関係ありません)(0.333333 ...無限に)。

絶対精度を確保したい場合は、次のdecimalモジュールが必要です。

>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83

print関数/ステートメントを使用する場合は違います(Pythonのバージョンによって異なります)。
Tim Pietzcker 2010

>>> 106.00/12 => 8.833333333333334
martineau 2010

22

10進モジュールを使用したいが、丸めモードも指定する必要があります。次に例を示します。

>>> import decimal
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP)
Decimal('8.34')
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
Decimal('8.33')
>>> 

13

はるかに簡単な方法は、単にround()関数を使用することです。これが例です。

total_price = float()
price_1 = 2.99
price_2 = 0.99
total_price = price_1 + price_2

今すぐtotal_priceを印刷すると、次のようになります。

3.9800000000000004

しかし、あなたがそれをそのようにround()関数で囲むならば

print(round(total_price,2))

出力は等しい

3.98

round()関数は、2つのパラメーターを受け入れることによって機能します。1つ目は、丸めたい数値です。2番目は、四捨五入する小数点以下の桁数です。


7

8.8333333333339を小数点以下2桁に四捨五入すると、正解は8.84ではなく8.83になります。8.83000000001を取得した理由は、8.83がバイナリで正しく表現できない数値であり、最も近い数値を提供するためです。すべてゼロなしで印刷する場合は、VGEの指示に従ってください。

print "%.2f" % 8.833333333339   #(Replace number with the variable?)

6

これを行う最も簡単な方法は、組み込みの以下の関数を使用することです。

format()

例えば:

format(1.242563,".2f")

出力は次のようになります。

1.24

同様に:

format(9.165654,".1f")

与えるだろう:

9.2

形式の答えは2010年にここに与えられまし。代わりに、その回答を更新することもできます。
ZF007 2018

5

丸めたい場合は、8.84が不正解です。8.833333333333の四捨五入は8.84ではなく8.83です。常に切り上げたい場合は、math.ceilを使用できます。浮動小数点数自体を丸めても意味がないため、両方を文字列フォーマットと組み合わせて実行します。

"%.2f" % (math.ceil(x * 100) / 100)

4

記録のためだけに。あなたはこのようにそれを行うことができます:

def roundno(no):
    return int(no//1 + ((no%1)/0.5)//1)

そこに、インクルード/インポートの必要はありません


2

これが切り上げ/切り下げ問題の私の解決策です

< .5  round down

> = .5  round up

import math

def _should_round_down(val: float):
    if val < 0:
        return ((val * -1) % 1) < 0.5
    return (val % 1) < 0.5

def _round(val: float, ndigits=0):
    if ndigits > 0:
        val *= 10 ** (ndigits - 1)
    is_positive = val > 0
    tmp_val = val
    if not is_positive:
        tmp_val *= -1
    rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val)
    if not is_positive:
        rounded_value *= -1
    if ndigits > 0:
        rounded_value /= 10 ** (ndigits - 1)
    return rounded_value

# test
# nr = 12.2548
# for digit in range(0, 4):
#     print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit)))

# output
# 0 decimals : 12.2548 -> 12
# 1 decimals : 12.2548 -> 12.0
# 2 decimals : 12.2548 -> 12.3
# 3 decimals : 12.2548 -> 12.25

1

私はこのコードを持っています:

tax = (tax / 100) * price

そしてこのコード:

tax = round((tax / 100) * price, 2)

ラウンドは私のために働いた


あなたは私の問題を解決しました。私はこれでしか丸めることができませんでした。他に何も機能しませんでした。 renewal_percentage=round(df_x_renewal_count/df_all_count*100)
Kierk


0

これを行うための簡単な関数は次のとおりです。

def precision(num,x):
    return "{0:.xf}".format(round(num))

ここで、numは10進数です。xは、浮動小数点数を四捨五入するまでの小数です。

他の実装に対する利点は、小数点以下x桁までの小数点以下の桁数を作成するために、小数点の右端のゼロを埋めることができることです。

例1:

precision(10.2, 9)

戻ります

10.200000000(小数点以下9桁まで)

例2:

precision(10.2231, 2)

戻ります

10.22(小数点以下2桁まで)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.