138

round()関数のドキュメントには、数値を渡し、小数点以下の位置を丸めると記載されています。したがって、これ行う必要があります。

n = 5.59
round(n, 1) # 5.6

しかし、実際には、古き良き浮動小数点の奇妙さが忍び寄り、次のようになります。

5.5999999999999996

UI のために、表示する必要があります5.6。インターネットを調べてみると、これが Python の実装に依存しているというドキュメントがいくつか見つかりました。残念ながら、これは私の Windows 開発マシンと私が試した各 Linux サーバーの両方で発生します。こちらもご覧ください

独自のラウンド ライブラリを作成する以外に、これを回避する方法はありますか?

4

20 に答える 20

107

保存方法はどうしようもありませんが、少なくともフォーマットは正しく機能します。

'%.1f' % round(n, 1) # Gives you '5.6'
于 2008-09-11T15:11:41.400 に答える
103

四捨五入しなくても、フォーマットは正しく機能します。

"%.1f" % n
于 2008-09-11T15:14:22.033 に答える
36

Decimal モジュールを使用すると、「round」関数を使用せずに概算できます。これは、特に通貨アプリケーションを作成するときに、丸めに使用しているものです。

from decimal import Decimal, ROUND_UP

Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)

これは 16.20 の 10 進数を返します。

于 2013-03-13T23:48:33.637 に答える
23

round(5.59, 1)正常に動作しています。問題は、5.6 を 2 進浮動小数点で正確に表すことができないことです。

>>> 5.6
5.5999999999999996
>>> 

Vinko が言うように、文字列の書式設定を使用して表示の丸めを行うことができます。

必要に応じて、Python には10 進演算用のモジュールがあります。

于 2008-09-11T21:27:35.070 に答える
17

str(round(n, 1))だけの代わりに行うと、「5.6」が得られますround(n, 1)

于 2008-09-11T15:13:28.777 に答える
12

データ型を整数に切り替えることができます。

>>> n = 5.59
>>> int(n * 10) / 10.0
5.5
>>> int(n * 10 + 0.5)
56

次に、ロケールの小数点記号を挿入して数値を表示します。

ただし、ジミーの答えの方が優れています。

于 2008-09-11T15:12:19.013 に答える
5

Decimal モジュールを見てみましょう

Decimal は、「人々を念頭に置いて設計された浮動小数点モデルに基づいており、必然的に最も重要な指針となる原則を持っています。コンピューターは、人々が学校で学ぶ算術と同じように機能する算術演算を提供する必要があります。」– 10 進算術仕様からの抜粋。

10 進数は正確に表すことができます。対照的に、1.1 や 2.2 などの数値は、2 進浮動小数点では正確に表現されません。通常、エンド ユーザーは、バイナリ浮動小数点の場合のように、1.1 + 2.2 が 3.3000000000000003 として表示されることを期待しません。

Decimal は、浮動小数点演算を必要とし、それらの結果を人間が読める形式 (会計など) で表示する必要があるアプリを簡単に作成できるような演算を提供します。

于 2010-07-12T04:12:38.953 に答える
5

さすがに大問題です。このコードを試してください:

print "%.2f" % (round((2*4.4+3*5.6+3*4.4)/8,2),)

4.85 と表示されます。次に、次のようにします。

print "Media = %.1f" % (round((2*4.4+3*5.6+3*4.4)/8,1),)

そしてそれは4.8を示しています。手で計算しますか?正確な答えは 4.85 ですが、試してみると:

print "Media = %.20f" % (round((2*4.4+3*5.6+3*4.4)/8,20),)

真実を見ることができます: 浮動小数点は、分母が 2 の累乗である分数の最も近い有限和として格納されます。

于 2013-06-25T12:00:58.487 に答える
5

浮動小数点演算は、わずかではあるが迷惑な精度の不正確さに対して脆弱です。整数または固定小数点で作業できる場合は、精度が保証されます。

于 2008-09-11T15:13:32.487 に答える
4

吸盤を印刷します。

print '%.1f' % 5.59  # returns 5.6
于 2008-09-11T15:14:15.623 に答える
3

%sprintf と同様に、文字列形式の operator を使用できます。

mystring = "%.2f" % 5.5999
于 2008-09-11T15:12:25.050 に答える
3

私がやっている:

int(round( x , 0))

この場合、最初に単位レベルで適切に丸め、次に float の出力を避けるために整数に変換します。

それで

>>> int(round(5.59,0))
6

この答えは、文字列をフォーマットするよりもうまく機能すると思います。また、ラウンド関数を使用する方が理にかなっています。

于 2017-02-24T15:57:46.700 に答える
2

完璧に動作します

format(5.59, '.1f') # to display
float(format(5.59, '.1f')) #to round
于 2015-11-18T04:10:22.283 に答える
-4

どうですか:

round(n,1)+epsilon
于 2008-09-11T15:11:04.430 に答える