0

PHPの浮動小数点値63.59072952118762をpostgresの倍精度列に格納しようとしています。Postgresは値を63.59073として保存します。誰かが理由を知っていますか?その値には8バイトで十分です。精度を指定するときに機能するデータ型numericを試してみましたが、実際には必要ありません。

更新: 63.5907295を保存しようとすると同じ問題が発生するため、保存される前にdoubleで何かが発生するという提案は現実的です。

Update II(部分的に解決済み):doubleパラメーターを割り当てる行は次のようになります。

$stmt->bindParam(4, $this->latitude);

私が知らなかったのは、PDOのデフォルトのパラメータタイプが文字列であるということです。私はそれをPDO::PARAM INTに変更しましたが、より良い代替手段がなく(PARAM DOUBLEはオプションではありませんでした)、postgresに格納されたdoubleで10桁の精度が得られました(少なくともある程度の進歩)。数値タイプが適切に機能することを確認したので、数値はPDOを使用する場合の方法であり、小数点以下10桁を超える精度が必要なdoubleを使用する方法のようです。

とにかく、誰かが言ったように、私がこの種の精度を持つことが必須であるかどうかはわかりませんが、問題自体は調査する価値があると思います。

4

3 に答える 3

2
  • PostgreSQLが何を保存しているかをどのように判断しますか?
  • データをPostgreSQLにどのように送信しますか?
  • どうやってデータを取り戻すのですか?
  • どのように表示しますか?
  • データベースの列はどのタイプですか?

PHPとPostgreSQLの間のパスには、データの表現方法について混乱する可能性のある場所がたくさんあります。


データがDBMSに挿入される方法を説明することが重要です。INSERTステートメントでリテラル値を使用すると、バインドされたパラメーターを使用する場合とは異なる一連の問題が発生します。SQLで値を書き出した場合:

INSERT INTO SomeTable(SomeColumn) VALUES(63.xxxxxxxxx);

データが切り捨てられた場合、PostgreSQLで問題が発生します。変数をバインドする場合は、PHPおよびPDO PostgresSQLモジュールが値をどのように処理するかを理解する必要があります。これはdoubleとして送信されるのか、文字列として送信されるのか、どのコードが変換を処理するのかなどです。

Perl + DBI + DBD :: YourDBMS(この場合はDBD :: Pg)で同様の問題が発生します。

于 2009-07-10T21:44:07.903 に答える
1

それほどの精度が必要な場合は、 DECIMAL/NUMERICタイプの使用を検討してください

于 2009-07-10T22:04:13.667 に答える
0

PostgreSQLは、実際の型を選択する際にfloat(1)からfloat(24)を受け入れますが、float(25)からfloat(53)は倍精度を選択します。

ほとんどのプラットフォームPGでは、実際のタイプの範囲は少なくとも1E-37から1E + 37で、精度は少なくとも10進数の6桁です。倍精度タイプは通常、1E-307から1E + 308程度の範囲で、15桁以上の精度があります(REF

どちらを使いますか?

于 2009-07-10T21:48:14.667 に答える