现在的位置: 首页 > 综合 > 正文

将数字四舍五入保留两位小数

2013年09月20日 ⁄ 综合 ⁄ 共 2602字 ⁄ 字号 评论关闭

评论:将数字四舍五入保留两位小数
 
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单元
 

抱歉!评论已关闭.