潛在影響與無處不在,無關,它是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
進行舍入,或者在客戶端進行舍入。請注意,由於in answers to this question解釋的原因,沒有round(double precision, integer)
函數。所以你可能想要to_char
,例如。
regress=> SELECT to_char(FLOAT8 '1.44', 'MI999999999D99');
to_char
---------------
1.44
(1 row)
(祝PostgreSQL的暴露版本從float8
投來text
,讓你在每次呼叫的基礎上指定extra_float_digits
。這往往更接近人們真正想要的東西。我想我要補充一點,如果我得到時間...)
注意OP使用的是Pervasive數據庫引擎(http://en.wikipedia.org/wiki/Pervasive_PSQL)NOT Postgres –
@MattWilko是的,正如我在第一篇文章中指出的那樣。爲此目的,如果他們使用Python,這並不重要,但總體原則仍然適用。花車是不精確的,所以你存儲的不一定是你回來的東西,你應該將它們進行四捨五入和格式化以供用戶顯示。 –
同意所有我的觀點是'extra_float_digits'將無法在Pervasive PSQL中識別 –