線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3249
推到 Plurk!
推到 Facebook!

有關TFloatField輸入小數點的問題?

 
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-11 16:52:30 IP:218.163.xxx.xxx 未訂閱
小弟近來有一個問題十分的困擾 在TDBEdit中輸入50.55都會顯示50.549999,但若輸入50.5500001則會顯示50.550000。 曾輸入50.35也是會顯示成50.349999,但若輸入50.3500001則會顯示50.350000。如此不知道何時會發生類似狀況,請教各位先進如何解決。 我的系統為 Win2000 SP2 Delphi 5.0 pack1 MS SQL 7.0 該欄位資料型態為decimal,精準度15,小數點6位。 使用BDE連接資料庫 DisplayFormat為#,###,##0.000000 另外很奇怪的一點是,若我將資料庫的小數點設為4位時, 輸入50.55會顯示為50.549900,表示Delphi會依資料庫的小數點位數去判定顯示的東西。
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-11 17:18:53 IP:203.204.xxx.xxx 未訂閱
引言: 小弟近來有一個問題十分的困擾 在TDBEdit中輸入50.55都會顯示50.549999,但若輸入50.5500001則會顯示50.550000。 曾輸入50.35也是會顯示成50.349999,但若輸入50.3500001則會顯示50.350000。如此不知道何時會發生類似狀況,請教各位先進如何解決。 我的系統為 Win2000 SP2 Delphi 5.0 pack1 MS SQL 7.0 該欄位資料型態為decimal,精準度15,小數點6位。 使用BDE連接資料庫 DisplayFormat為#,###,##0.000000 另外很奇怪的一點是,若我將資料庫的小數點設為4位時, 輸入50.55會顯示為50.549900,表示Delphi會依資料庫的小數點位數去判定顯示的東西。
你DisplayFormat設為這樣當然都會出現六位小數,改用#,##0.#看有沒有好一點。
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-07-11 17:55:13 IP:218.163.xxx.xxx 未訂閱
不行, 因為我就是要顯示小數點下至第六位, 請問有其它的方法。
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-07-11 18:29:12 IP:203.204.xxx.xxx 未訂閱
引言: 不行, 因為我就是要顯示小數點下至第六位, 請問有其它的方法。
喔!好像誤會你的意思了,你是要輸入50.55出現50.550000這樣嗎? 我想了個小方法你試試,就是在欄位的OnSetText事件給 Sender.AsString := FormatFloat('0.000000', StrToFloat(Text));
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-07-12 10:22:40 IP:210.200.xxx.xxx 未訂閱
引言:
引言: 不行, 因為我就是要顯示小數點下至第六位, 請問有其它的方法。
喔!好像誤會你的意思了,你是要輸入50.55出現50.550000這樣嗎? 我想了個小方法你試試,就是在欄位的OnSetText事件給 Sender.AsString := FormatFloat('0.000000', StrToFloat(Text));
jieshu 兄: 您這方法和在 DisplayFormat 設為 #,###,##0.000000 應該效果是一樣的(我猜測的). 我想會不會 Wesly 兄 BDE 的 BCD Enable 沒設成 True, 或是欄位型態精準度無法支援之故 ? 因為 MS-SQL 我沒用過, 不知道 decimal 和 Numberic 精準度有沒有一樣.
------
將問題盡快結案也是一種禮貌!
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-07-12 11:31:06 IP:203.204.xxx.xxx 未訂閱
引言: jieshu 兄: 您這方法和在 DisplayFormat 設為 #,###,##0.000000 應該效果是一樣的(我猜測的). 我想會不會 Wesly 兄 BDE 的 BCD Enable 沒設成 True, 或是欄位型態精準度無法支援之故 ? 因為 MS-SQL 我沒用過, 不知道 decimal 和 Numberic 精準度有沒有一樣.
danny 兄: 我那個做法還是一樣得設DisplayFormat,然後利用OnSetText事件來改變他的輸入值,也就是他輸入未滿六位時補滿六位,這樣就會類似他描述的輸入50.5500001則會顯示50.550000
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-07-12 12:19:27 IP:192.168.xxx.xxx 未訂閱
引言: 小弟近來有一個問題十分的困擾 在TDBEdit中輸入50.55都會顯示50.549999,但若輸入50.5500001則會顯示50.550000。 曾輸入50.35也是會顯示成50.349999,但若輸入50.3500001則會顯示50.350000。如此不知道何時會發生類似狀況,請教各位先進如何解決。 我的系統為 Win2000 SP2 Delphi 5.0 pack1 MS SQL 7.0 該欄位資料型態為decimal,精準度15,小數點6位。 使用BDE連接資料庫 DisplayFormat為#,###,##0.000000 另外很奇怪的一點是,若我將資料庫的小數點設為4位時, 輸入50.55會顯示為50.549900,表示Delphi會依資料庫的小數點位數去判定顯示的東西。
站長也曾遇到過,在Borland 的 Trubo C (DOS版中),符點運算好像會有此BUG, 在Delphi也曾遇過一次,我懷疑是Borland程式碼的問題喔! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-07-12 13:55:27 IP:211.22.xxx.xxx 未訂閱
先在此謝謝上列各位先進的回覆. 我沒有設定BCD, 因為BCD的顯示欄位只能到小數點下四位, 而我需要至第六位. 我的問題是在DBEdit下輸入50.55時, 它會顯示50.549999; 但若輸入50.5500001時則顯示如我所需50.550000. 而此狀況不一定何時會發生. 但我總不能向客戶說你若出現上述情況時, 就在最尾端多輸一碼1, 因為不合理. 另外我透過SQL Moniter去看, scale 確實為6位, 所以我想這與Decimal及Numberic無關. 難道Delphi對小數點較長的精準度會有問題嗎? 真是有些失望.
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-07-12 14:55:05 IP:210.200.xxx.xxx 未訂閱
引言: 先在此謝謝上列各位先進的回覆. 我沒有設定BCD, 因為BCD的顯示欄位只能到小數點下四位, 而我需要至第六位. 我的問題是在DBEdit下輸入50.55時, 它會顯示50.549999; 但若輸入50.5500001時則顯示如我所需50.550000. 而此狀況不一定何時會發生. 但我總不能向客戶說你若出現上述情況時, 就在最尾端多輸一碼1, 因為不合理. 另外我透過SQL Moniter去看, scale 確實為6位, 所以我想這與Decimal及Numberic無關. 難道Delphi對小數點較長的精準度會有問題嗎? 真是有些失望.
我查了一下 BDE function DbiBcdFromFloat (var iVal: Double; iPrecision: Word; iPlaces: Word; var Bcd: FMTBcd): DBIResult stdcall; 他是宣告成 Double 型態, 而 Double 型態確實是會有您說的問題, 但我又查 BDE 的設定, 如下: 說明如下: 所以我的建議是改 DECIMACDIGITS 為 5 or 6 看看. 如果再不行您可能要試試 ADO 看看了. 發表人 - danny 於 2002/07/12 14:56:15
------
將問題盡快結案也是一種禮貌!
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-07-12 16:30:38 IP:211.22.xxx.xxx 未訂閱
DECIMACDIGITS 為 5, 6, 7, 我都試過了, 都不行. 看樣子只有靠ADO了. 只是我十分的納悶, 沒有ADO前, 先進們是怎麼解決此一問題的.
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-07-12 17:21:29 IP:203.204.xxx.xxx 未訂閱
引言: DECIMACDIGITS 為 5, 6, 7, 我都試過了, 都不行. 看樣子只有靠ADO了. 只是我十分的納悶, 沒有ADO前, 先進們是怎麼解決此一問題的.
你有試過用OnSetText來改變使用者的輸入值了嗎?
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-07-12 18:22:44 IP:211.22.xxx.xxx 未訂閱
我也有用OnSetText來改變使用者的輸入值, 但還是不行。我去Trace發現是TFloatField的問題, 程式如下 procedure TForm1.Query1priceSetText(Sender: TField; const Text: String); var txt: String; begin txt := FormatFloat('0.000000', StrToFloat(Text)); Sender.AsString := txt;<---在此處 txt 的值是50.550000, 但顯示時為50.549999 end; 所以我認為是TFloatField的問題, 不知如何解決, 又無法去Trace DB.pas, 在ADO下就沒有這個問題。
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-07-13 10:33:28 IP:210.200.xxx.xxx 未訂閱
引言: 我也有用OnSetText來改變使用者的輸入值, 但還是不行。我去Trace發現是TFloatField的問題, 程式如下 procedure TForm1.Query1priceSetText(Sender: TField; const Text: String); var txt: String; begin txt := FormatFloat('0.000000', StrToFloat(Text)); Sender.AsString := txt;<---在此處 txt 的值是50.550000, 但顯示時為50.549999 end; 所以我認為是TFloatField的問題, 不知如何解決, 又無法去Trace DB.pas, 在ADO下就沒有這個問題。
您可以將 TFloatField 換成 TCurrencyField 看看, Float 精準度是有問題, Borland 是建議改用 Currency.
------
將問題盡快結案也是一種禮貌!
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-07-13 10:54:34 IP:211.74.xxx.xxx 未訂閱
有, 我也有將TFloatField 換成 TCurrencyField, 結果還是一樣。我有去看過SysUtils及DB的內部, 雖說TCurrencyField的精確度較高, 但最後還是透過FormatFloat的function傳入, 如同上述一樣是傳入Sender.AsString後有問題。 我現在在用其它方式測試, 如果可以我再與大家分享。 感謝danny兄這些天的討論。
天外來客
初階會員


發表:22
回覆:199
積分:44
註冊:2001-11-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-07-13 11:50:01 IP:203.204.xxx.xxx 未訂閱
請將 ENABLE BCD 設定為 TRUE
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-07-15 09:30:34 IP:218.163.xxx.xxx 未訂閱
如我上述所言若輸入50.5500001則會顯示50.550000, 只有在此騙Delphi的系統, 將 Sender.AsString := FormatFloat('0.00000001', StrToFloat(Text)); 如此一來顯示的值會如同我所需50.550000, 而非50.499999。這大慨是一種無奈吧.
系統時間:2024-04-29 14:20:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!