48

Excel スプレッドシートからデータを取得し、数値を丸め、小数点を削除するスクリプトに取り組んでいます。たとえば、2606.89579999999 は 26069 になります。末尾のゼロなので、2606.89579999999 は 260690 になります。

私は現在それを持っているのでi、Excel のセルからデータを取得し、小数点以下 2 桁 ( i = round(i, 2)) に丸めます。これにより、上記の例では小数点が 1 桁になります。

これを で動作させる方法を見つけようとしましたがDecimal、動作させることができないようです。

丸められた値が「0」で終わらない場合、丸められる他のすべての数値は で正常に機能しround(i, 2)ますが、数値がたまたま *.x0 で終わる場合、その 0 は削除され、データが台無しになります。

4

6 に答える 6

65

末尾のゼロについて話しているので、これは文字列としての表現に関する質問です。使用できます

>>> "%.2f" % round(2606.89579999999, 2)
'2606.90'

または、format機能を備えたモダンなスタイルを使用します。

>>> '{:.2f}'.format(round(2606.89579999999, 2))
'2606.90'

replaceorを使用してポイントを削除しますtranslate( _Python コンソールでの前のコマンドの結果を参照します):

>>> _.translate(None, '.')
'260690'

.2fformat は同じ丸めを適用するため、ここでは丸めは必要ないことに注意してください。

>>> "%.2f" % 2606.89579999999
'2606.90'

しかし、あなたがExcelに言及したように、浮動小数点表現のために奇妙な結果につながる可能性があるため、おそらく独自の丸め関数をロールするか、 decimalを使用することを選択するでしょう:float.round

>>> round(2.675, 2)
2.67
>>> round(2606.89579999999, 2)
2606.89

10 進数ではquantizeを使用します。

>>> from decimal import *
>>> x = Decimal('2606.8950000000001')
# Decimal('2606.8950000000001')
>>> '{}'.format(x.quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN))
'2606.90'

元のタスクでは、次のようになります。

>>> x = Decimal('2606.8950000000001')
>>> int((x*100).quantize(1, rounding=ROUND_HALF_EVEN))
260690

そして、奇妙な丸めの理由は次のように前面に出てきDecimalます:

>>> x = Decimal(2606.8950000000001)
# Decimal('2606.89499999999998181010596454143524169921875') # internal float repr
于 2013-11-14T19:34:10.517 に答える
5
>>> '{:.2f}'.format(2606.89579999999).replace('.', '')
'260690'
于 2013-11-14T19:36:29.970 に答える