gz818
21140
|
2006/1/20 17:43:52 |
delphi7 下如何四舍六入五单双? |
tinysoft
12854
|
2005/2/25 21:09:13 |
看了大家的方法,我还是喜欢用Format函数! |
web700
11867
|
2005/1/18 11:39:36 |
function intdata(d:double):double; begin result:=int((d+0.5)*100/100); end; |
qian8233
7911
|
2004/8/19 18:34:15 |
由于对系统函数的了解太少,出现这种情况是可以理解的; 对于delphi7中的roundto函数帮助:“RoundTo(1234567, 3)=1234000”是完全错误的,而且实际的运行结果跟我们小学时对四舍五入的理解完全一致:1235000。 |
blazingfire
7888
|
2004/8/18 19:43:02 |
这几行代码实在不敢公为。要效率没有效率 其实要达到这个功能很简单就可以实现的 |
wr960204
7886
|
2004/8/18 18:03:46 |
uses Math; SimpleRoundTo函数就是四舍五入 |
shaoyy
7713
|
2004/8/11 14:40:14 |
溢出可以不用考虑,这种运算很平常啊,在实际中几乎碰不到一个real类型的数乘100后发生溢出的情况。 |
wataki
7694
|
2004/8/11 3:13:10 |
f := Trunc((f + 0.005) *100) /100 可能会溢出 |
shaoyy
7632
|
2004/8/8 3:39:16 |
呵呵,实现这功能还这么麻烦?其实不用RoundTo也可以简单实现:
f := Trunc((f + 0.005) *100) /100 |
suexy
7564
|
2004/8/5 13:12:00 |
只需要 format('%.2f',[FloattoStr(yourfloat)]就可以得到保留小数点后两位,且四舍五入。 |
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; 结果不同,后则只能四舍六入,不知道为什么? |
test004
6818
|
2004/7/15 16:35:27 |
真是好,想不到这个东西还这么有意义。 |
iamdream
6811
|
2004/7/15 15:09:50 |
以上的“故而如用RoundTo来四舍五入,则可在舍入位后的第二位加上5,如0.145,则加上0.0005,此时成为0.1455,再舍入时,就为0.15了!”应删去. |
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> |
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; |
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); |