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

請問關於 formatfloat 的奇怪問題

答題得分者是:小傑克
larrytyan
一般會員


發表:51
回覆:38
積分:17
註冊:2004-08-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-14 11:37:23 IP:210.68.xxx.xxx 訂閱
請問
var r1, r2 :real;
r1 := 380;
r2 := 9.575;
FormatFloat('0',r1*r2) => 3638

FormatFloat('0',380*9.575) => 3639


為什麼會這樣呢??
如果真會這樣, 如果用 formatfloat 來做四捨五入不就會有問題了嗎??


P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-15 02:53:31 IP:61.67.xxx.xxx 未訂閱
1.請先用四捨五入搜尋一下本站, 你就會發現答案了
2.你用 formatfloat('0'...)來取捨到整數, 本來就會有四捨五入的問題, 這那裡好奇怪的呢?
larrytyan
一般會員


發表:51
回覆:38
積分:17
註冊:2004-08-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-15 08:25:20 IP:210.68.xxx.xxx 訂閱
Dear 版主.
我用四捨五入搜尋了好久, 之後看到有人說已經放棄 round 而改用 formatfloat,
我想問的是 FormatFloat('0',r1*r2) 和 FormatFloat('0',380*9.575) 結果為什麼會不同呢?
這也是四捨五入的問題嗎? 為什麼?


===================引 用 P.D. 文 章===================
1.請先用四捨五入搜尋一下本站, 你就會發現答案了
2.你用 formatfloat('0'...)來取捨到整數, 本來就會有四捨五入的問題, 這那裡好奇怪的呢?
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-15 12:47:09 IP:218.80.xxx.xxx 訂閱

[code delphi]

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var r1, r2 :real;
begin
r1 := 380;
r2 := 9.575;
ShowMessage(FormatFloat('0.000',r1*r2));
end;
end.

[/code]

你可以按照上面的方法进行更改,如果要四舍五入的话,就用ROUND函数

[/code]
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
larrytyan
一般會員


發表:51
回覆:38
積分:17
註冊:2004-08-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-15 13:38:12 IP:210.68.xxx.xxx 訂閱
Dear Sir.
1. ROUND 不合用, 因為它是四捨六入伍成雙
2. 我的小數點是不固定的,(從 0 到 8 位都有可能),
如果只要取整數, ShowMessage(FormatFloat('0',r1*r2)) 結果為 3638 這是不對的.
應該是 3639


===================引 用 zhouying82 文 章===================

[code delphi]

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var r1, r2 :real;
begin
r1 := 380;
r2 := 9.575;
ShowMessage(FormatFloat('0.000',r1*r2));
end;
end.

[/code]

你可以按照上面的方法进行更改,如果要四舍五入的话,就用ROUND函数

[/code]
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-15 14:16:40 IP:122.116.xxx.xxx 未訂閱
您好,

用 math 的 simpleroundto
或是自己寫一個 function 去處理
看看
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-15 15:21:09 IP:59.112.xxx.xxx 訂閱
為何會不同....理論上 real , double 是趨近值 當你寫 r1 := 9.575 時 r1 有可能是9.574999999999.... or  9.575000000...1 
也許你會懷疑,你可以用 -380 * 9.575 去跑,你就會發現 system處理的方式
解決方法也很多,許多前輩都討論過, 也許你可以改用currency
或是自己寫function 處理

Fundamental real types
Type Range Significant digits Size in bytes
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
Comp -2^63 1 .. 2^63 -1 19-20 8
Currency -922337203685477.5808.. 922337203685477.5807 19-20 8
The generic type Real, in its current implementation, is equivalent to Double.
Generic real types
Type Range Significant digits Size in bytes
Real 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8

===================引 用 larrytyan 文 章===================
Dear 版主.
我用四捨五入搜尋了好久, 之後看到有人說已經放棄 round 而改用 formatfloat,
我想問的是 FormatFloat('0',r1*r2) 和 FormatFloat('0',380*9.575) 結果為什麼會不同呢?
這也是四捨五入的問題嗎? 為什麼?
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-04-15 15:25:13, 註解 無‧
系統時間:2024-05-19 11:47:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!