2016-08-30 10 views
1

浮動小数点数0.01の出力で 'struct pack and unpack'を使用すると0.009999999776482582になります。 私のプロジェクトではfloatの値を設定する必要があります。 バイナリファイルに保存する必要があり、このデータが後で解析される必要があり、設定された正確な値が必要です。浮動小数点数0.01の出力でstruct packとunpackを使用すると、0.009999999776482582になります。

正確な値0.01を格納して同じ値を取得できる方法があれば、助けてもらえますか?

投稿の一部に基づいて、私はすでにfloatの代わりにdoubleを使ってみましたが、動作しますが、doubleを使用することによる問題はファイルサイズの増加です。私は浮動小数点数のパラメータをたくさん持ち、0から5までの値を取ることができます。 したがって、他の提案もありがたいです。ここで

は、サンプルコードには浮動小数点数0.01はありません

import struct 
a = 0.01 
b = struct.pack('<f', a) 
c = struct.unpack('<f', b) 
print c 
(0.009999999776482582,) 
+1

正確な値「0.01」は、浮く。おそらく '0.01'を正確に表現したい場合は、' decimal'モジュールを見ることができます。 –

+0

どのような種類の値を保存していますか?数字は0から5まで、小数点は何桁までと言いますか? – vz0

+4

"いくつかの投稿に基づいて、私はすでにfloatの代わりにdoubleを使ってみましたが、それはうまくいきますが、二重使用の問題は私のファイルサイズの増加です" - すべての精度を保持するためにストレージ価格を支払うつもりがなければあなたの出力の精度の低下について不平を言うべきではありません。 – user2357112

答えて

2

です。 IEEE浮動小数点数は、実数の行全体を表すわけではありません。特定のバイナリ方式を使用した近似を表します。最も近い近似値は、10進表現0.009999999776482582です。

テキスト表現(例:json)をシリアライズしたり、任意の精度を表すBigDecimalをピックすることができます。

2

数字は0から5までです。小数点以下2桁(0.00,0.01、...、5.00)しか必要ない場合は、数値を16ビット整数で格納することができます。まず数値に100を掛けて数値を100で割り算すると、数値を100で除算すると、浮動小数点数に比べて50%のスペースを節約できます。小数点以下2桁以上の精度が必要な場合は、数を掛けて1000,10000などで割り、HからIにフォーマットを変更する必要があります。

+0

'int(a * 100)'は切り捨てられます。これは、 'a'が0.009999999の場合に間違った結果を与えることがあります。 – interjay

+0

このトリックの主な条件は、最大2桁、有効数字2桁しか持たないことです。つまり、私は0.009のような数字は期待していません。だから私は彼が扱っている数字の種類を尋ねたのです。 – vz0

+0

数値は浮動小数点なので、0.01などの数値は不正確なため、0.0099999999になる可能性があります。切り捨てるのではなく、最も近い数値に丸める必要があります。 – interjay

関連する問題