Основной эффект не имеет ничего общего с распространенным, это a simple floating point issue. Вы найдете то же самое в любой системе, которая использует плавающие точки с двойной или двойной точностью, хотя некоторые системы выполняют автоматическое округление, чтобы скрыть это от вас.
http://en.wikipedia.org/wiki/Floating_point См
В случае PostgreSQL и его производных, вы можете установить extra_float_digits
контролировать это округление.
regress=> SET extra_float_digits = 3;
SET
regress=> SELECT FLOAT8 '1.44';
float8
---------------------
1.43999999999999995
(1 row)
regress=> SET extra_float_digits = 0;
SET
regress=> SELECT FLOAT8 '1.44';
float8
--------
1.44
(1 row)
По умолчанию 0, но ваш драйвер клиента может его изменить. Если вы используете JDBC (который, как я предполагаю, вы есть), не связывайтесь с этим параметром, драйвер JDBC ожидает, что он останется тем, как его устанавливает драйвер, и будет вас расстраивать, если вы его измените.
В общем случае, если вы хотите, чтобы читаемый форматированный номер был человеком, вы должны делать округление с round
или to_char
или вместо этого делать это на стороне клиента. Обратите внимание, что нет функции round(double precision, integer)
по причинам, описанным ниже in answers to this question. Поэтому вам, вероятно, понадобится to_char
, например.
regress=> SELECT to_char(FLOAT8 '1.44', 'MI999999999D99');
to_char
---------------
1.44
(1 row)
(Я хочу PostgreSQL разоблачил версию отлитого из float8
в text
, которые позволяют вам указать extra_float_digits
на основе каждого вызова. Это часто ближе к тому, что люди действительно хотят. Думаю, я должен добавить, что если я получаю время ...)
Обратите внимание, что OP использует Pervasive engine engine (http://en.wikipedia.org/wiki/Pervasive_PSQL) NOT Postgres –
@MattWilko Да, как я отметил в первом параграфе. Для этого было бы неважно, если бы они использовали Python, общий принцип все же применяется. Поплавки неточны, поэтому то, что вы храните, не обязательно означает, что вы вернетесь, и вы должны округлить и отформатировать их для пользовательского отображения. –
Согласитесь со всем, что моя точка зрения заключалась в том, что 'extra_float_digits' не будет распознаваться в Pervasive PSQL –