Pregunta

Intento almacenar el valor de coma flotante de PHP 63.59072952118762 en una columna de doble precisión en postgres.Postgres almacena el valor como 63.59073.¿Alguien sabe por qué?8 bytes deberían ser más que suficientes para ese valor.Lo intenté con el tipo de datos numérico, que funciona al especificar la precisión, pero en realidad no debería ser necesario.

Actualizar: El mismo problema se presenta al intentar almacenar 63.5907295, por lo que la sugerencia de que algo sucede con el doble antes de que se almacene parece realista.

Actualización II (parcialmente resuelta):La línea donde asigno el parámetro doble se ve así:

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

Lo que no sabía es que PDO por defecto su tipo de parámetro es cadena.Lo cambié a PDO::PARAM INT a falta de una alternativa mejor (PARAM DOUBLE no era una opción) y obtuve una precisión de 10 dígitos en el doble almacenado en postgres (algo de progreso, al menos).He comprobado que el tipo numérico funciona bien, por lo que parece que el numérico es el camino a seguir cuando se usa PDO y los dobles deben tener una precisión de más de 10 decimales.

De todos modos, como alguien mencionó, no sé si es imprescindible para mí tener este tipo de precisión, pero creo que el problema en sí merece ser investigado.

¿Fue útil?

Solución

  • ¿Cómo se determina cuál es el almacenamiento de PostgreSQL?
  • ¿Cómo se envían los datos a PostgreSQL?
  • ¿Cómo se obtiene los datos de nuevo otra vez?
  • ¿Cómo mostrarlo?
  • ¿Qué tipo es la columna en la base de datos?

Hay muchos, muchos lugares en el camino entre PHP y PostgreSQL donde puede haber confusión acerca de cómo representar los datos.


Es importante explicar cómo los datos se inserta en el DBMS. El uso de un valor literal de la sentencia INSERT conduce a un conjunto diferente de problemas del uso de parámetros ligados. Si escribió el valor en el SQL:

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

y se truncan los datos, usted tiene un problema en PostgreSQL. Si enlaza la variable, que tiene que estar seguro de entender lo que los módulos DOP PostgresSQL PHP y lo hacen con el valor - se enviará como un doble, o como una cadena, y que se ocupa de código con la conversión, y así sucesivamente <. / p>

Te encuentras con problemas análogos con Perl DBI + + DBD :: YourDBMS (DBD :: Pg en su caso).

Otros consejos

Considere el uso de la decimal / numérico tipo de si necesita que gran precisión

PostgreSQL acepta flotador (1) a flotador (24) como la selección del tipo real, mientras flotador (25) a flotador (53) seleccione de doble precisión.

En la mayoría de las plataformas de PG, el tipo real tiene un alcance de al menos 1E-37 a 1E + 37 con una precisión de al menos 6 dígitos decimales. El tipo de precisión doble tiene típicamente una gama de alrededor de 1E-307 a 1E + 308 con una precisión de al menos 15 dígitos ( REF )

¿Qué proceso debe utilizar?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top