请教关于四舍五入的问题(100分)

  • 主题发起人 主题发起人 xiegang
  • 开始时间 开始时间
X

xiegang

Unregistered / Unconfirmed
GUEST, unregistred user!
今天被客户叫去说收费系统总遇到四舍五入有错误,遇到0.5时有时进1有时不进
我调试后发现如:round(22.5) 等于 22
还发现 round(24.5) 等于 24
round(26.5) 等于 26
而 round(23.5) 等于 24
round(25.5) 等于 26
后来明白原来是所谓的四舍五入成双的问题(明显手工都不会这样处理的)
由于客户要求是四舍五入到元的,所以一张单下来跟手工误差可能会有一两元,甚至几元钱,客户比较在意,以前做的系统都是精确到分或角的所以没注意这个问题
请问大家如何解决这个问题,是说服客户接受(似乎有点难),还是改程序(好象挺烦)?
 
银行家算法。早结贴吧。。
提示:提问之前,请查询历史数据吧。。
 
这是会计制度就是这样定的.
 
换个函数吧。
var
f1, f2: Double;
i1, i2: Integer;
begin
f1 := 2.5;
i1 := Trunc(f1 + 0.5);

f2 := 3.5;
i2 := Trunc(f2 + 0.5);
ShowMessage(IntToStr(i1) + #13 + IntToStr(i2));
end;
 
Edit1.Text:=FormatFloat('#',126.5);
 
帮助里面不是说的很清楚的,对于刚好位于中间的数据,始终返回偶数!

我在使用Round、Trunc等函数的时候,一般加上最多小位数再多1~2位的一个小数,
比如,X最多可能是2为小数,我的调用一般是:
Trunc(X+0.0001)或者Trunc(X+0.001)
 
Delphi的Round采用的银行家舍入法。要使之符合我们日常的四舍五入法,需要这样做一下:
round(24.5 + 0.0000001) = 25
即,在你要舍入的数值基础上再加一个极小的小数(小到不影响数据的实际使用值),就可以实现四舍五入了
 
因为round 采用 银行家算法 。最好的办法 是
function myround (a:single):single;
begin
result:=round(a);
if (a-round)>=0.5 then
result:=result+0.5;
end;
 
各位说的都没错,我想问一下银行家算法到底用在哪里?
vb里面的round函数也是同样的问题。
 
我倒是自己在写函数,比如 X 四舍五入(保留2位): (int((X* 100)+0.5))/100
int可以换成word,longint等
 
不是用在哪。 是因为这个算法更科学。
 
Round函数 小数取法为 : 四舍六入,五靠偶!
例: Round(4.5)=4 Round(5.5)=6
这是Round的小数取法归折!
 
记不清了,好像是这个函数 SimpleRound
 
function xiaoshu(a:single):single;
begin
result=Trunc(a);
if (a-result>0.5) then
begin
result=result+1;
end
else
return result;
end;

这样能不实现四舍五入啊!
 
多人接受答案了。
 
后退
顶部