Python 2.7で小数点以下2桁に丸めますか?


82

Python 2.7を使用して、数値を10桁ではなく小数点以下2桁に丸めるにはどうすればよいですか?

print "financial return of outcome 1 =","$"+str(out1)

2
これはワームの缶である可能性があります。財務データを浮動小数点変数に格納していて、それを丸めたいですか?ほとんどの場合、正確な丸めは不可能です。Decimal実際に何をしようとしているかに応じて、整数またはsを使用することをお勧めします。
Tim Pietzcker 2013

フォーマット指定子について学びます。文字列に変換せずに、float値を直接出力できます。
John Doe 2013

回答:


198

組み込み関数を使用しますround()

>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

または組み込み関数format()

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

または新しいスタイルの文字列フォーマット:

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

または古いスタイルの文字列フォーマット:

>>> "%.2f" % (1.679)
'1.68'

ヘルプround

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.

2
文字列のフォーマット方法は、Decimalsを操作するときに役立ちます。例Decimal("{:.2f}".format(val))
パッチリックウォルシュ

@PatchRickWalshまたは単にDecimal(format(val, '.2f'))
Ashwini Chaudhary 2014年

9
涼しい!私はそのフォーマットが組み込まれていることを知りませんでした。さらに詳しく調べた後、浮動小数点エラーが絶対に受け入れられない場合は、これが最も正確な丸め方法だと思いDecimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)ますDecimal('123.35')。一方Decimal(format(Decimal('123.345'), '.2f'))、あなたは与えDecimal('123.34')123.345のバイナリ表現未満123.345ですので。
パッチリックウォルシュ2014年

47

財務数値について話しているので、浮動小数点演算を使用したくありません。Decimalを使用したほうがよいでしょう。

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

新しいスタイルのテキスト出力フォーマットformat()(デフォルトは半偶数丸め):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

浮動小数点の不正確さによる丸めの違いを参照してください。

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

財務価値を丸める適切な方法

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

異なるトランザクションで他のタイプの丸めを行うことも一般的です。

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

収益の結果をシミュレートしている場合、セントの端数を支払う/受け取ることも、セントの端数を超える利息を受け取ることもできないため、利息期間ごとに丸める必要がある可能性があることに注意してください。シミュレーションでは、固有の不確実性のために浮動小数点を使用するのが非常に一般的ですが、そうする場合は、エラーが存在することを常に覚えておいてください。そのため、固定金利の投資でさえ、このためにリターンが少し異なる可能性があります。


5

あなたも使うことができますstr.format()

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23

4

ペニー/整数で作業する場合。115($ 1.15のように)やその他の数字で問題が発生します。

整数を浮動小数点数に変換する関数がありました。

...
return float(115 * 0.01)

それはほとんどの場合うまくいきましたが、時々それはのようなものを返すでしょう1.1500000000000001

だから私はこのように戻るように関数を変更しました...

...
return float(format(115 * 0.01, '.2f'))

そしてそれは戻り1.15ます。Not'1.15'または1.1500000000000001(文字列ではなくfloatを返します)

これはグーグルでの最初の結果なので、私は主にこれを投稿しているので、このシナリオで私がしたことを思い出すことができます。


別の回答で指摘されているように、財務データには浮動小数点数ではなく10進数を使用します。
Bruno Le Floch 2017年

1
私はほとんどすべてを整数に変換することになりました。作業がはるかに簡単なようです。しかし、私はペニーの端数を扱うことは何もしていませんでした。
teewuane 2017年

2

最善の方法は、format()関数を使用することです

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

しかし、私は言わなければなりません:財務価値を扱うときは、ラウンドやフォーマットを使用しないでください。


formatf形式には非文字列が必要です。そうでない場合は、ValueErrorが発生します。正しいコードは次のとおりです。format(out1, '.2f')文字列にキャストしない
danius 2018

2

round()関数を使用すると、正しい値が得られません。

ラウンド(2.735)とラウンド(2.725)を使用して確認できます

使ってください

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)

テストした例、結果、およびそれらのどこが間違っていると思いますかを追加してください。
Liran Funaro 2017年

import math num = input( 'Enter a number')numr = float(round(num、2))print numr
Midhun MM


0

かなり簡単な回避策は、最初にfloatを文字列に変換し、最初の4つの数値の部分文字列を選択し、最後に部分文字列をfloatに戻すことです。例えば:

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

超効率的ではないかもしれませんが、シンプルで機能します:)


2
この方法は非常に信頼性がありません。値の小数点以下が1桁を超える場合、必要な2桁の小数点以下は取得できません。負の数でも同じ問題。
アンドレ・KUHLMANN

0

次の0.05に切り上げると、次のようになります。

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.