2016-05-12 8 views
3

私は、ある限界を超える最初の3つの「割り当て」を修正しようとする機能を構築し始めました。フロートを計算してリストに格納すると奇妙な値が得られますか?

以下の関数は、渡されたリストの値ごとに超過した値を持つリストを返します。

def correct_wrong_allocations_zw(weight_vect): 
    temp_weight_vect = list(weight_vect[:3]) 

    limits = [1.00, 0.30, 0.25] 
    too_much_list = [] 

    too_much = 0.00 
    for i in range(0, len(temp_weight_vect)): 
     if temp_weight_vect[i] > limits[i]: 
      too_much_list.append(temp_weight_vect[i]-limits[i]) 

    return too_much_list 

allocations = [0.10, 0.40, 0.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00] 
allocations = correct_wrong_allocations_zw(allocations) 
print allocations 

配分差[1]と制限[1] 0.10であり、まだこのプログラムの結果は:何が起こっているか

[0.10000000000000003, 0.25] 

+0

値を丸めるには、書式付きのprintfを使用してください。使用される内部バイナリ表現は、合理的な1/10に正確に一致することはできません。印刷された小数点以上は、合理的な1/3に完全に一致します。 – mpez0

+0

浮動小数点精度をフォーマットされた出力以上に制御する場合は、[decimal](https://docs.python.org/2.7/library/decimal.html)モジュールを参照してください。 – schwobaseggl

+1

私は人々がその汎用目的の質問へのリンクをやめ、Python固有のものを見つけることを願っています。なぜなら、これがどのように動作するか、各言語で修正できるかというニュアンスがあるからです。 –

答えて

2

これはFloating Point Arithmetic: Issues and Limitationsです。これは はPythonのバグではありません、それはどちらかあなたのコードのバグではありません。これは、バイナリ浮動小数点の本質であることを

注意。 ハードウェアの浮動小数点演算をサポートするすべての言語で同じ種類のものが表示されます(一部の言語では、デフォルトで、またはすべての出力モードで差異が表示されない場合があります)。


ところで、あなたは、任意の特定のPythonのフロートに保存された正確な値を確認するには、モジュールdecimalを使用することができます。あなたの場合、

>>> from decimal import Decimal 
>>> Decimal(0.4-0.3) 
Decimal('0.100000000000000033306690738754696212708950042724609375') 
+1

正確な小数点演算を行う必要がある場合は、 'Decimal'モジュールを使用することもできます。 –

関連する問題