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

關於round()

答題得分者是:GrandRURU
ycl2005
一般會員


發表:15
回覆:14
積分:5
註冊:2005-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-09 09:24:22 IP:211.75.xxx.xxx 訂閱
環境: Windows XP + delphi 7 Enterprise

a:integer;
b:double;
c:integer;
a:=15;
b:=28.9;
c:=round(a*b) // 不曉得為什麼答案是433
//a*b=433.5 照理說應該 round(433.5) 應該等於434
c:=round(433.5) // 答案等於434

請問為什麼 round(a*b) 的答案是433 而不是434 ?



GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-09 09:44:03 IP:59.120.xxx.xxx 未訂閱
請參閱:
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=21876


【delphi】Round函数四舍六入五留双 - [Delphi技术]
作者:佚名 来源:网络
--------------------------------------------------------------------------------
Round(所在单元:Math)
功能说明:对一个实数进行四舍五入。(按照银行家算法)
参考实例:
var
I, j: Integer;
begin
i := Round(1.5); // i等于2
j := Round(2.5); // j等于2
end;
在Delphi中使用Round函数得到的答案有时与我们所预期的会不太一样:
采用的是四舍六入五留双。即当舍或入位大于或小于五时按四舍五入来处理,而当舍或入位等于五时,就要看前
面一位是什么,根据奇进偶不进,它总是返回一个偶数值。
示例 结果
i:= Round(11.5) 12
i:= Round(10.5) 10
这种Round其实是按照银行家算法,统计学上一般都用这种算法,比传统的"四舍五入"要科学。
如果要使用传统的"四舍五入"方法,可以使用下面函数:
function RoundClassic(R: Real)
[code delphi]
function RoundClassic(R: Real): Int64;
begin
Result:= Trunc(R);
if Frac(R) >= 0.5 then
Result := Result 1;
end;
[/code]
-
⊕本文来自: 藤县综合网 http://www.txzhw.com/Html/Delphi/20080118/News_15789.html


===================引 用 ycl2005 文 章===================
環境: Windows XP delphi 7 Enterprise

a:integer;
b:double;
c:integer;
a:=15;
b:=28.9;
c:=round(a*b) // 不曉得為什麼答案是433
//a*b=433.5 照理說應該 round(433.5) 應該等於434
c:=round(433.5) // 答案等於434

請問為什麼 round(a*b) 的答案是433 而不是434 ?



編輯記錄
GrandRURU 重新編輯於 2011-05-08 19:47:17, 註解 無‧
GrandRURU 重新編輯於 2011-05-08 21:58:09, 註解 無‧
ycl2005
一般會員


發表:15
回覆:14
積分:5
註冊:2005-10-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-09 10:06:35 IP:211.75.xxx.xxx 訂閱
謝謝回答,
我問題的重點是 round(433.5) // 答案是434, 因是是四捨六入五成雙, 奇數進位, 偶數捨去. 這問我知道,
問題是 round(a*b) // 為什麼答案是433, a*b =433.5 啊, 出來的答案為什麼不是434 ?
編輯記錄
ycl2005 重新編輯於 2011-05-08 20:07:21, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-05-09 11:37:36 IP:59.120.xxx.xxx 未訂閱
因為DOUBLE得到的真值是:433.499999999999
所以,就不會是你想要的結果

不過,繞一下還是能得到正確的結果

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
a:integer;
b, c:Double;
d:integer;
begin
a:=15;
b:=28.9;
c:=a*b; // 不曉得為什麼答案是433
//a*b=433.5 照理說應該 round(433.5) 應該等於434
d:=round(c); // 答案等於434
Caption := IntToStr(a) ',' FloatToStr(b) ',' FloatToStr(c) ',' IntToStr(d);
end;
[/code]

===================引 用 ycl2005 文 章===================
謝謝回答,
我問題的重點是 round(433.5) // 答案是434, 因是是四捨六入五成雙, 奇數進位, 偶數捨去. 這問我知道,
問題是 round(a*b) // 為什麼答案是433, a*b=433.5 啊, 出來的答案為什麼不是434 ?
編輯記錄
GrandRURU 重新編輯於 2011-05-08 21:48:10, 註解 無‧
系統時間:2024-04-26 10:19:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!