四舍五入的问题,非常奇怪(200分)

  • 主题发起人 主题发起人 mvb
  • 开始时间 开始时间
M

mvb

Unregistered / Unconfirmed
GUEST, unregistred user!
为解决四舍五入的问题,自已写了一个函数。这是函数的源代码(Delphi7):
//aValue为9.825,aDigit为-2
function SelfDefRoundTo(aValue: Double; aDigit: TRoundToRange = 0): Double;
var
fPower: Double;
begin
fPower := Power(10, aDigit * -1);
//此时FPower为100
Result := aValue * fPower + 0.5;
//此时Result为983
Result := Trunc(Result);
//这里出问题了,Result变成了982?
Result := Result / fPower;
// 用下面这行代码一样的结果
// Result := SimpleRoundTo(aValue * fPower, 0) / fPower;
end;
请问这是什么原因,是因为CPU吗?我用的是AMD Athlon 1800+.
 
啊,本身Format不能四舍五入嘛?写什么嘛。。
Result中间当然不对了,
 
四舍六入五留双
 
Dephi里面自带RoundTo函数的啊,你可以看看源代码,但是round和roundto都存在一个问题就是当小数刚好是0.5的时候,会出现偏差,如 round(0.5) = 0,round(1.5)=2等,我的解决办法是增加一个小的尾数来处理,如round(x+0.00001),只要增加的尾数尽量不会影响到结果就行了。
 
是,不需要自己写函数的呀
 
//你看看这两个函数吧
function DoRound(Value: Extended): Int64;
procedure Set8087CW(NewCW: Word);
asm MOV Default8087CW,
AX FNCLEX FLDCW Default8087CW end;
const RoundUpCW = $1B32;var OldCW : Word;
begin OldCW := Default8087CW;
try
Set8087CW(RoundUpCW);
Result := Round(Value);
finally
Set8087CW(OldCW);
end;
end;
---------------------------
确定
---------------------------


这个在大富翁找的,不错,分享分享
function RoundFloat(f:double;i:integer):double;
var
s:string;
ef:extended;
begin
s:='#.'+StringOfChar('0',i);
ef:=StrToFloat(FloatToStr(f));//防止浮点运算的误差
result:=StrToFloat(FormatFloat(s,ef));
end;
 
方法一:
function SelfDefRountTo(aValue:Double;ADigit:Integer=0):Double;
var
fPower:Double;
begin
fPower:=100;
Result:=aValue*fPower+0.5;
Result:=Round(Result);//在运算期间,DELPHI就把982.5进行了位取高位,所以不会对982.5+0.5其实在计算机里并不是等于983的,
end;
方法二:

function SelfDefRountTo(aValue:Double;ADigit:Integer=0):Double;
var
fPower:Double;
begin
fPower:=100;
Result:=aValue*fPower+0.50000001;
Result:=Trunc(Result);//
end;
方法三:
做什么函数,本身FORMAT就够你使用了。
procedure TForm1.BitBtn3Click(Sender: TObject);
var
a:Double;
begin
a:=9.825;
ed_Value.Text:=Format('%.0f',[9.825*100]);

end;

要么使用RountTo函数。。。
 
多人接受答案了。
 
后退
顶部