Почему postgresql не сохраняет все мое значение с плавающей запятой (PHP)?

StackOverflow https://stackoverflow.com/questions/1112016

Вопрос

Я пытаюсь сохранить значение PHP с плавающей запятой 63.59072952118762 в столбце двойной точности в postgres.Postgres сохраняет значение как 63,59073.Кто-нибудь знает, почему?8 байт должно быть более чем достаточно для этого значения.Я пробовал использовать числовой тип данных, который работает при указании точности, но в этом нет необходимости.

Обновлять: Та же проблема возникает при попытке сохранить 63.5907295, поэтому предположение, что с двойником что-то произойдет до того, как оно будет сохранено, кажется реалистичным.

Обновление II (частично решено):Строка, в которой я присваиваю параметр double, выглядит следующим образом:

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

Чего я не знал, так это того, что PDO по умолчанию устанавливает тип параметра в строку.Я изменил его на PDO::PARAM INT из-за отсутствия лучшей альтернативы (PARAM DOUBLE не был вариантом) и получил точность 10 цифр в двойном значении, хранящемся в postgres (по крайней мере, некоторый прогресс).Я проверил, что числовой тип работает хорошо, поэтому кажется, что числовой тип — это лучший вариант при использовании PDO и двойных чисел, которые должны иметь точность более 10 десятичных знаков.

В любом случае, как кто-то заметил, я не знаю, необходима ли мне такая точность, но я думаю, что проблема сама по себе заслуживает изучения.

Это было полезно?

Решение

  • Как определить, что хранит PostgreSQL?
  • Как отправить данные в PostgreSQL?
  • Как вернуть данные обратно?
  • Как вы это показываете?
  • Какого типа столбец в базе данных?

На пути между PHP и PostgreSQL существует много-много мест, где может возникнуть путаница в отношении представления данных.


Важно объяснить, как данные вставляются в СУБД.Использование буквального значения в инструкции INSERT приводит к иному набору проблем, чем использование связанных параметров.Если вы записали значение в SQL:

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

и данные были усечены, у вас возникнут проблемы в PostgreSQL.Если вы привязываете переменную, вы должны быть уверены в том, что модули PHP и PDO PostgresSQL делают со значением — отправляется ли оно как двойное значение или как строка, какой код занимается преобразованием и так далее.

Вы сталкиваетесь с аналогичными проблемами с Perl + DBI + DBD::YourDBMS (DBD::Pg в вашем случае).

Другие советы

Рассмотрите возможность использования ДЕСЯТИЧНЫЙ/ЦИФРОВОЙ введите, если вам нужна такая точность

PostgreSQL принимает значения от float(1) до float(24) как выбор реального типа, а от float(25) до float(53) выбирает двойную точность.

На большинстве платформ PG реальный тип имеет диапазон от 1E-37 до 1E+37 с точностью не менее 6 десятичных цифр.Тип двойной точности обычно имеет диапазон от 1E-307 до 1E+308 с точностью не менее 15 цифр (ССЫЛКА)

Какой из них вы используете?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top