0

「.fits」テーブルに保存された値があります (これには問題はありません)。私は表を読んで、

In [2]: a['RA_touse'][0]
Out[2]: 161.65813

これが実際のアーカイブ値です。ただし、次のようにします。

In [3]: print a['RA_touse'][0]
161.658

切り捨てられた値を取得します。私はPythonをPOSTGRESと一緒に使用していますが、この動作により精度の問題が発生しています。

誰かがこの動作を私に説明してくれますか?それを解決する方法はありますか? データを変更するのではなく、同じ形式に保つ必要があります (つまり、repr() 関数はすべてを文字列に変換します)。

どうもありがとう!

わかりやすくするために編集します。

Pythonスクリプトを使用してデータベースを作成しています。私がすることは

con = psycopg2.connect('todatabase')
cur = con.cursor()
for i in vector_of_something:
    value1 = table['column1'][i]
    value2 = table['column2'][i]
    values = (values1,values2)
    values = [str(value) for value in values]
    command = 'INSERT INTO table values (%s,%s)'
    cur.execute(command,values)
con.commit()

問題は、結果としてデータベースに 1.65813 ではなく「161.658」が表示されることです。

4

3 に答える 3

0

問題は文字列変換であることがわかりました。最後に、すべてを文字列に変換して、すべてを POSTGRESQL 用にフォーマットします。私が行った場合

values = [repr(vaue) for value in values]

アップロードされた値は正しいです。

ご協力いただきありがとうございます!

于 2013-04-30T15:54:16.417 に答える
0

浮動小数点値を使用するときは、コードまたはアプリケーション インターフェイスで基数 10 (通常) で記述しているが、基数 2 で格納されていることを覚えておく必要があります。これは整数値にも当てはまりますが、そうではありません。すべての整数は任意の基数で正確に表すことができるため、そこに問題があります。問題を示すために、10 進数から 2 進数への変換の例をいくつか示します。

dec   bin
.1    .000110011(0011 repeating)
.2    .0011(r)
.25   .01
.3(r) .01(r)
.5    .1

基数 10 で表現するのが簡単な値は、基数 2 で常に有限に表現できるとは限りません。 このDecimalオブジェクトは、浮動小数点演算の 10 進精度を維持する必要性を満たすために特に存在します。

于 2013-04-30T15:42:54.957 に答える