有關TFloatField輸入小數點的問題? |
|
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
小弟近來有一個問題十分的困擾
在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 發送簡訊給我 |
引言: 小弟近來有一個問題十分的困擾 在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/ |
||
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
|||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 不行, 因為我就是要顯示小數點下至第六位, 請問有其它的方法。喔!好像誤會你的意思了,你是要輸入50.55出現50.550000這樣嗎? 我想了個小方法你試試,就是在欄位的OnSetText事件給 Sender.AsString := FormatFloat('0.000000', StrToFloat(Text));
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
引言:jieshu 兄: 您這方法和在 DisplayFormat 設為 #,###,##0.000000 應該效果是一樣的(我猜測的). 我想會不會 Wesly 兄 BDE 的 BCD Enable 沒設成 True, 或是欄位型態精準度無法支援之故 ? 因為 MS-SQL 我沒用過, 不知道 decimal 和 Numberic 精準度有沒有一樣.引言: 不行, 因為我就是要顯示小數點下至第六位, 請問有其它的方法。喔!好像誤會你的意思了,你是要輸入50.55出現50.550000這樣嗎? 我想了個小方法你試試,就是在欄位的OnSetText事件給 Sender.AsString := FormatFloat('0.000000', StrToFloat(Text));
------
將問題盡快結案也是一種禮貌! |
||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 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/ |
||
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 小弟近來有一個問題十分的困擾 在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 發送簡訊給我 |
先在此謝謝上列各位先進的回覆.
我沒有設定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 發送簡訊給我 |
引言: 先在此謝謝上列各位先進的回覆. 我沒有設定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 發送簡訊給我 |
|||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: DECIMACDIGITS 為 5, 6, 7, 我都試過了, 都不行. 看樣子只有靠ADO了. 只是我十分的納悶, 沒有ADO前, 先進們是怎麼解決此一問題的.你有試過用OnSetText來改變使用者的輸入值了嗎?
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
我也有用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 發送簡訊給我 |
引言: 我也有用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 發送簡訊給我 |
|||
天外來客
初階會員 發表:22 回覆:199 積分:44 註冊:2001-11-27 發送簡訊給我 |
|||
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |