有没有真正的四舍五入函数?(20分)

  • 主题发起人 主题发起人 ooooh
  • 开始时间 开始时间
O

ooooh

Unregistered / Unconfirmed
GUEST, unregistred user!
round( )并不是真正的四舍五入函数
round(2.5) = 2
round(1.5) = 2
难道只能如下:
strtoint(formatfloat('#',2.5)) = 3
 
trunc(x+0.5)
 
楼上的负数就不可以了
 
Result:=StrToFloat(Format('%.'+IntToStr(I)+'f',[F]));
 
Floattostr(SimpleRoundTo(-2.5,0));
 
StrToFloat(FloatToStrF( 12.345,ffFixed,15,2 ))
绝对OK,在自己开发的程序中测试通过
 
大家好,我是个新手 想问一下在delphi中想让一个表单在一定时间后关闭需要timer和什么控件
 
楼主,方法有没有用,总该结贴了吧
 
showmessage(FloatToStr(RoundTo(1.235, -2)));
 
LZ.理论上说,2.5 经过4舍5入后是应该为2的,因为2是偶数,原来就是这样定义的
 
以前是四舍五入,现在国际上通用的规则是四舍六入五考虑。
 
引用Math单元,使用RoundTo
 
delphi那些全都是所谓的银行家算法,都不是四舍五入。
偶自己写的,用字符串运算的
{-------------------------------------------------------------------------------
过程名: xRound1
作者: CurveSoft
日期: 2003.05.19
参数: Value: Extended; DataScale: integer
返回值: Extended

正确的四舍五入算法
由于Dephi的RoundTo,SimpleRoundTo,FormatFloat等函数使用所谓的“银行家”算法,
不符合我们的习惯,故编写此四舍五入算法,使用字符串进行四舍五入运算。
此处CPU消耗较大。
-------------------------------------------------------------------------------}
function xRound1(Value: Extended; DataScale: integer): Extended;
var
Sign, aPos: integer;
sValue: string;
begin
Sign := 1;
if Value < 0 then Sign := -1;
Value := Value * Sign;
Value := (Value * Power(10,DataScale)) + 0.5;
sValue := FloatToStr(Value);
aPos := Pos('.',sValue);
if aPos > 0 then sValue := Copy(sValue,1,aPos-1);
Value := StrToFloat(sValue);
Value := Value / Power(10,DataScale);
Value := Value * Sign;

Result:= Value;
end;
 
有这么复杂吗?
function Round_cn(r:real):integer;
begin
if r>=0 then result:=trunc(x+0.5)
else result:=trunc(x-0.5);
end;
 
看来还是用自已的方法简单点.
trunc..round....等都不是真正的四舍五入,大家可试验下,亦可以搜下本站这方面的贴子.
 
后退
顶部