2012-05-06 13 views
3

我使用delphi 2010和db2 9.7 Express-C,並且我有一個數據庫有幾個小數類型的字段以使用貨幣值。現在我發現使用它有一些問題,例如9.20的值在我的前端顯示的值爲9.19999980926514。我需要將數據庫中的所有字段更改爲DECFLOAT,或者是否有tfield或其他替代方法中的函數,屬性來解決它?使用十進制數據類型使用db2和delphi 2010的貨幣值使用

謝謝。 戴維斯

+1

有時候,生活是['殘酷'](http://pages.cs.wisc.edu/~rkennedy/exact-float?number=9.20) - )那麼,此時'TField'和你的數據庫列的數據類型是什麼?你打算只顯示價值還是想在客戶端以某種方式使用它(如某些計算)?你能把這個包括進你的問題嗎? – TLama

+0

我已經與貨幣和自動四捨五入的頭痛了我的公平份額。我用直的整數,分到四分位,並繼續負責四捨五入。 –

+0

您使用哪個數據訪問庫? dbExpress可以使用 .AsCurrency – mjn

回答

3

直接與貨幣小數工作幾乎總是一個問題。由於從數據庫到您的前端應用程序的不同轉換,可能會失去或獲得(這也適用於大多數財務系統 - 請參閱bankers rounding)。


我建議你在進行操作/顯示/等之前使用RoundTo函數。關於四捨五入的非常好的文章​​

另一個建議將使用Currency類型。這裏有一個關於這個問題,關於這種類型的很好的解釋How to avoid rounding problems when comparing currency values in Delphi?

+1

解決方案來訪問返回貨幣數據類型的貨幣字段值。該錯誤是由數據庫中的字段類型引起的。在數據庫中是作爲真正的數據類型,而不是小數。我改爲十進制(X,2),現在在前端是好的。 而德爾福並沒有真正認識到字段DECFLOAT的類型。 謝謝。 Davis –

+0

如果你的數據庫支持Delphi的貨幣類型,你應該使用它。某些浮點數不能在IEEE-754浮點二進制點變量中精確表示,例如,1.295表示爲1.29499 99999.如果您必須使用浮點字段,請查看John Herbsters四捨五入程序http://cc.embarcadero.com /項目/ 21909。 –

+0

@MaxWilliams - DB2'DECIMAL'和'NUMERIC'類型是[Binary-Encoded decimal](http://en.wikipedia.org/wiki/Binary-coded_decimal)表示,所以他在那裏沒有麻煩。 –

相關問題