評論:將數字四捨五入保留兩位小數
aket 6799 2004-7-15 0:46:18
將數字四捨五入保留兩位小數不需要這麼複雜,用下面這個就可以。
直接使用RoundTo函數,需要uses中加入math。
RoundTo(1.245, -2); = 1.25
需要注意的是,舊的Delphi版本Round函數採用的是四捨六入,逢五的時候是前面是奇數才入,是偶數則不入,delphi手冊協助中的樣本如下:
RoundTo(1234567, 3) 1234000
RoundTo(1.234, -2) 1.23
RoundTo(1.235, -2) 1.24
RoundTo(1.245, -2) 1.24
但delphi 7已經不是這樣的了,是直接四捨五入的:RoundTo(1.245, -2) = 1.25。
為了相容舊版本,可以處理下代碼,加上0.005後在採用Round函數,如上例:
RoundTo(1.245+0.005, -2);
aket 6800 2004-7-15 0:50:50
上面RoundTo(1.245+0.005, -2);有誤,應該如下處理:
function SSWR(r: real): real;
begin
result := r*100+0.5;
result := TRUNC(result)/100;
end;
iamdream 6810 2004-7-15 15:05:33
以下是我研究的結果(Delphi6):
RoundTo(及Round)函數使用所謂“銀行家舍入法”<Banker's Rounding>(對於舍入位後為5的情況,則舍入位為偶數,則舍,為奇數,則入),而Format函數則為正常的四捨五入法,取例如下:
0.145 RoundTo(0.145, -2) = 0.14
0.145 Format('%8.2f', 0.145) = 0.15
0.155 RoundTo(0.155, -2) = 0.16
0.155 Format('%8.2f', 0.155) = 0.16
另在進行浮點數的運算時,可能會出現0.14499999999999的情況,此時的值按數學上要求實際應為0.145,如用以上方法舍入到小數點後兩位時,均不能達到想要的效果。
另SimpleRoundTo比RoundTo更接近四捨五入法,但不完全是四捨五入,如對0.145用SimpleRoundTo(0.145, -2)舍入時仍為0.14;
如果後面還有小數,如0.1450000001,此時舍入,則三者均為0.15!
對1.145,SimpleRoundTo舍入為1.15!
故而如用RoundTo來四捨五入,則可在舍入位後的第二位加上5,如0.145,則加上0.0005,此時成為0.1455,再舍入時,就為0.15了!
因此四捨五入取兩位小數時,只要先加上0.0001,然後用RoundTo或SimpleRoundTo即可。
<2004.7.15>
iamdream 6811 2004-7-15 15:09:50
以上的“故而如用RoundTo來四捨五入,則可在舍入位後的第二位加上5,如0.145,則加上0.0005,此時成為0.1455,再舍入時,就為0.15了!”應刪去.
test004 6818 2004-7-15 16:35:27
真是好,想不到這個東西還這麼有意義。
aket 6821 2004-7-15 18:28:43
昨天測試發現一個問題,如下:
function SSWR(r: real): real;
begin
result := r*100+0.5;
result := TRUNC(result)/100;
end;
和
function SSWR(r: real): real;
begin
result := TRUNC(r*100+0.5)/100;
end;
結果不同,後則只能四捨六入,不知道為什嗎?
suexy 7564 2004-8-5 13:12:00
只需要 format('%.2f',[FloattoStr(yourfloat)]就可以得到保留小數點後兩位,且四捨五入。
shaoyy 7632 2004-8-8 3:39:16
呵呵,實現這功能還這麼麻煩?其實不用RoundTo也可以簡單實現:
f := Trunc((f + 0.005) *100) /100
wataki 7694 2004-8-11 3:13:10
f := Trunc((f + 0.005) *100) /100
可能會溢出
shaoyy 7713 2004-8-11 14:40:14
溢出可以不用考慮,這種運算很平常啊,在實際中幾乎碰不到一個real類型的數乘100後發生溢出的情況。
wr960204 7886 2004-8-18 18:03:46
uses
Math;
SimpleRoundTo函數就是四捨五入
blazingfire 7888 2004-8-18 19:43:02
這幾行代碼實在不敢公為。要效率沒有效率
其實要達到這個功能很簡單就可以實現的
qian8233 7911 2004-8-19 18:34:15
由於對系統函數的瞭解太少,出現這種情況是可以理解的;
對於delphi7中的roundto函數協助:“RoundTo(1234567, 3)=1234000”是完全錯誤的,而且實際的運行結果跟我們小學時對四捨五入的理解完全一致:1235000。
web700 11867 2005-1-18 11:39:36
function intdata(d:double):double;
begin
result:=int((d+0.5)*100/100);
end;
tinysoft 12854 2005-2-25 21:09:13
看了大家的方法,我還是喜歡用Format函數!
gz818 21140 2006-1-20 17:43:52
delphi7 下如何四捨六入五單雙?
懵: (39281533) 15:06:48
type
TRoundToRange = -37..37;
function MyRoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
var
LFactor: Double;
begin
LFactor := IntPower(10, ADigit);
Result := Trunc(AValue / LFactor + 0.5) * LFactor;
end;
懵: (39281533) 15:06:57
但是要引用Math單元