2014-01-21 20 views
0

希望有人能幫助!我們遇到了Pervasive VAccess控件的問題,因此,只要我們將「double」類型的項目保存到Pervasive數據庫中,保存的值就不同於我們想要的那個...Pervasive VAccess控件v雙數據類型

作爲示例,我們嘗試保存1.44,它實際上節省1.44004035454

在微小的差別,但仍然區別!

僅供參考在DDF中定義的字段將小數設置爲0,我想知道是否有一種行爲是將其設置爲例如4?但我想我會看到,如果有人能夠在我們走下這條道路之前擺脫任何光線,那麼......

回答

0

潛在影響與無處不在,無關,它是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驅動程序希望它保持驅動程序的設置方式,如果你改變的話,會讓你感到不安。

一般來說,如果你想要一個人類可讀的格式化數字,你應該使用roundto_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。這往往更接近人們真正想要的東西。我想我要補充一點,如果我得到時間...)

+0

注意OP使用的是Pervasive數據庫引擎(http://en.wikipedia.org/wiki/Pervasive_PSQL)NOT Postgres –

+0

@MattWilko是的,正如我在第一篇文章中指出的那樣。爲此目的,如果他們使用Python,這並不重要,但總體原則仍然適用。花車是不精確的,所以你存儲的不一定是你回來的東西,你應該將它們進行四捨五入和格式化以供用戶顯示。 –

+0

同意所有我的觀點是'extra_float_digits'將無法在Pervasive PSQL中識別 –