abchjb

导航

delphi 四舍五入

在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的。这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 5.5、6.5) 实施Round函数时,处理器根据小数点前数字的奇、偶性来确定舍入与否,如 5.5 Round 结果为 6,而 6.5 Round 结果也为6, 因为 6 是偶数。


对于XXX.5的情况,整数部分是奇数,那么会Round Up,偶数会Round Down,例如:

x:= Round(17.5) = x = 18

x:= Round(12.5) = x = 12

请使用下面的函数代替Round:

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 Shisha(x: Double; n: Integer): Double;
  begin
    x := x*power(10,n-1);
    x := Trunc(x + 0.5);
    Result := x*power(10,1-n);
  end;



 一、四舍五入法
    四舍五入是一种应用非常广泛的近似计算方法,其有算术舍入法和银行家舍入法两种。
    所谓算术舍入法,就是我们通常意义上的四舍五入法。其规则是:当舍去位的数值大于等于5时,在舍去该位的同时向前位进一;当舍去位的数值小于5时,则直接舍去该位。
    所谓银行家舍入法,其实质是一种四舍六入五留双(又称四舍六入五奇偶)法。其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。
    综上所述,两种舍入法所得结果不尽一致,因此在使用时必须根据实际需要加以区别。否则会出现一些莫明其妙的偏差。
    二、Delphi中的四舍五入函数
    众所周知,Delphi中有一个四舍五入取整函数Round。但它是按银行家舍入法的规则实施舍入操作的,Delphi中没有按算术舍入法规则实施舍入操作的四舍五入取整函数。为此,本人编写了一个基于算术舍入法的四舍五入取整函数RoundEx作为对Delphi的补充。具体实现如下:
    function RoundEx (const Value: Real): integer;
    var
      x: Real;
    begin
      x := Value - Trunc(Value);
      if x >= 0.5 then
        Result := Trunc(Value) + 1
      else Result := Trunc(Value);
    end;

posted on 2004-04-09 22:00  忘我  阅读(1447)  评论(0)    收藏  举报