Pythonでの丸めに関する質問はすでに何度も尋ねられていることは知っていますが、答えは私を助けませんでした。浮動小数点数を半分に丸めて浮動小数点数を返すメソッドを探しています。このメソッドは、小数点以下の桁数を定義するパラメーターも受け入れる必要があります。このような丸めを実装するメソッドを作成しました。ただ、見た目は上品ではないようです。
def round_half_up(number, dec_places):
s = str(number)
d = decimal.Decimal(s).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
フロートを文字列に変換して(浮動小数点の不正確さを回避するため)、decimalモジュールを操作する必要があるのが気に入らない。より良い解決策はありますか?
編集:以下の回答で指摘されているように、正しい丸めはそもそも数値の正しい表現を必要とするため、私の問題の解決策はそれほど明白ではありませんが、これは浮動小数点の場合とは異なります。だから私は次のコードが
def round_half_up(number, dec_places):
d = decimal.Decimal(number).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
(上記のちょうどフロート番号を直接進数にしていない文字列に変換されるという事実により、コードから異なりが最初という)は、このように使用する場合2.18を返すために:round_half_up(2.175, 2)
しかし、それはしませんので、Decimal(2.175)
戻りますDecimal('2.17499999999999982236431605997495353221893310546875')
フロート、道を番号はコンピュータによって表されます。驚いたことに、浮動小数点数が最初に文字列に変換されるため、最初のコードは2.18を返します。str()関数は、最初に丸めることを意図していた数に暗黙の丸めを行っているようです。したがって、2つの丸めが行われています。これは私が期待する結果ですが、技術的に間違っています。