全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3909
推到 Plurk!
推到 Facebook!

小數點的問題,有誤差 !!

答題得分者是:dllee
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-15 04:06:18 IP:211.76.xxx.xxx 訂閱
各位大大 ~ 
我利用 Adoquery 抓資料庫裡面的數值,出現的結果總是有小小的誤差,例如 49.70 他就變成了 49.7000007629395, 諸如此類的 ~ 看起來問題並不大,但是我連續加總數量大的話就會有誤差質就會影響結果了,我參考了這篇 http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=90847 使用EditMask 結果還是一樣,而其他使用printf 或者 format 都是變成 string 並不利於加總,所以我並沒有錯測試,請問有什麼辦法可以解決的嘛 !?

再補充一下,剛剛測試了 這篇 http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=68018 所提到的方法,使用 format ,結果還是一樣的 !!
編輯記錄
UB 重新編輯於 2007-11-15 04:19:07, 註解 無‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-15 08:00:27 IP:220.134.xxx.xxx 訂閱
原始數值是使用 Single 存的嗎?看起來像是用 Single 存的資料因精確度不足所造成的。
數值改用 Double 或 Extended 去存,就不會有問題了。



VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-16 14:17:23 IP:203.79.xxx.xxx 訂閱
不好意思沒有把環境說清楚 ~
我是用 MySQL 5 版的
至於抓出來的欄位在資料庫裡是用 float(6,2)
而在Delphi 裡面則是用 Double 或者 Real (交叉使用)

再補充問一下,使用 Real 會有問題嘛 !?
編輯記錄
UB 重新編輯於 2007-11-16 14:20:21, 註解 無‧
chenyk
高階會員


發表:14
回覆:95
積分:171
註冊:2002-07-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-19 13:35:31 IP:202.39.xxx.xxx 訂閱
如果是透過 mysql 進行加總,那建議在資料寫入資料庫時強迫設定小數位數
例如:
a:= 1.123

SQL := 'update table_name set field_name=' Format('%.2f',[a]) 'Where xxx'

real 和 double 只差在精確度,只要不溢位,用哪個都一樣
嗯~~可能執行效率會一點差異
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-19 20:19:10 IP:59.105.xxx.xxx 訂閱
我使用 BCB 作簡單的測試:
[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double dd=49.70; // 8 Bytes 浮點數
float ff=49.70; // 4 Bytes 浮點數
Edit1->Text=AnsiString(dd);
Edit2->Text=AnsiString(ff);
}
[/code]
結果
Edit1 顯示 49.7
Edit2 顯示 49.7000007629395
用 Delphi (我亂寫的, 我沒 Delphi )
[code delphi]
Double dd:=49.70; // 8 Bytes 浮點數
Single ss:=49.70; // 4 Bytes 浮點數
Edit1.Text:=dd;
Edit2.Text=ss;
[/code]
應該可以看到相同的結果。

因為看到您提的數值 49.70 會變成 49.7000007629395
就是儲存的精度不夠所導致。
我沒用過 MySQL,資料庫也是不熟,不過,您的問題還是在資料或變數儲存時,在某一個環節使用了 4 Bytes 的浮點數所導致。您可以在每一個變數或資料儲存的環節上,把數值作記錄,看看是那個環節出了問題。


VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-20 00:50:56 IP:203.79.xxx.xxx 訂閱
dllee 老大是正確的 ~
問題出在資料庫的資料欄位為 float(6,2), 我測試過了,如果使用 double(6,2) 就完全沒有問題 !!
只怪當初學藝不精,現在又有新的問題來了,我有將近 1000 個 Table ,要寫一個程式把全部的 float 改成 double,又要擔心影響到資料庫裡的資料, ~ 真的一個頭兩個大了 ~
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-11-20 08:26:00 IP:220.134.xxx.xxx 訂閱
將原資料庫備份,把它匯出,改完格式再匯到新的資料庫。
MySQL 應該也可以線上改欄位格式。
只要資料備份好,亂試試不成,再還原回去即可。
在 PC 下,把 \mysql\data 整個備份即可。(之前在玩 phpBB 時,我是這樣備份的 ^_^)

VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
系統時間:2024-05-07 11:38:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!