对实数进行“四舍五入”的函数!,要求其中一个参数是四舍五入的位数!

解决方案 »

  1.   

    function round(x: Extended): Int64;
      

  2.   

    trunc();这是取整
    round();这是四舍五入
      

  3.   

    procedure Str(X [: Width [: Decimals ]]; var S);
    var   S, T: string;begin   Str(1.4:2:1, T);
       S := T + ' rounds to ' + IntToStr(Round(1.4)) + #13#10;
       Str(1.5:2:1, T);
       S := S + T + ' rounds to ' + IntToStr(Round(1.5)) + #13#10;
       Str(-1.4:2:1, T);
       S := S + T + ' rounds to ' + IntToStr(Round(-1.4)) + #13#10;
       Str(-1.5:2:1, T);
       S := S + T + ' rounds to ' + IntToStr(Round(-1.5));
       MessageDlg(S, mtInformation, [mbOk], 0);
    end;
      

  4.   

    Str(1.4:2:1, T) 1.4表示你要输入的数字,:2表示数字的长度,:1表示小数点的位数 
    设定小数位数后,类型转换,Round(StrToFloat(T))
      

  5.   

    function roundEx(num: Float;Wided,decimas : Integer) :Float;
    var
      T : string;
    begin  
      Str(num:Width:decimas , T) //width;整个数据长度,decimas:小数点位数
      Result :=Round(StrToFloat(T));
    end;
      

  6.   

    当心round会欺骗你,
    分别试试:round(4.5)和round(5.5)
    你会发现round(4.5)返回4,不是我们期望的5
    而round(5.5)返回的是6也就是说,对于偶数,round园整(.5)后的结果比正确值小1.
    对于奇数是正常的。
    这也是Delphi稀奇古怪的BUG之一
      

  7.   

    SetRoundMode(rmNearest);  //设定位四舍五入方式
    RoundTo(1.234, -2)         // 小数点后2位具体看帮助
      

  8.   

    to :csouth(金子)
    这是一种叫银行家四舍五入方式不是BUG
      

  9.   

    to :csouth(金子)
    这不是BUG,是银行家算法,因为它用
    FPU进行处理,所以没办法,
    这个问题在
    PASCAL 精要里有介绍
      

  10.   

    Round 會騙人的,真的,奇數或偶數代表正數部分,
    如果是 Round(奇數.5)=奇數+1
           Round(偶數.5)=偶數我再好就就發現這個問題了,但是我一直不知道是什么原因!
      

  11.   

    我觉得用FORMAT好,把它装换为STRING,在用STRING转成CURRENCY,这样精度应该不成问题
      

  12.   

    倒~~~~这个贴子存在了这么长时间,我还以为大家都说出来了方法呢结果一看,没一个人说对。trunc(x+0.5)就是四舍五入了。 例如 4.3+0.5=4.8,被trunc掉之后是4,程序执行正确。4.5+0.5=5,被trunc掉就是5,还是正确。
    对于取小数点多少位之后四舍五入,这样:
    trunc(x*a+0.5)/a,这里a为1,10,100等10的n-1次方(n=1,2,3,...)。
    所以,你要取0.54663小数点后面3位并四舍五入,就这样:
    0.54663*100+0.5=546.63+0.5=547.13,trunc之后时547,然后/100就成为0.547了.
      

  13.   

    直接用format函数
    function MyRound(numb,mystr:string):string;
    var
    s:string;
    begin
     s:='%0.'+numb+'f';
     result:=format(s,[strtofloat(mystr)]);
    end;
    其中numb为小数点后的位数,mystr为数据源,返回为想要的数
      

  14.   

    roundto(12.344,-2)=12.34
    roundto(12.344,-1)=12.3
    roundto(12.344)=12roundto(12.345,-2)=12.35
    ...
      

  15.   

    to Eastunfail(恶鱼杀手) 
    一个简单的问题为什么搞这么复杂
    比如0.54663四舍五入小数点后的4位
    就用
      StrToCurr(Format('%100.2f',[0.54663]));这样得到的是精确的数字,小数为的位数和
    值都可以动态的写入
      

  16.   

    roundto或SimpleRoundTo,看你的需要,不如看看帮助。SimpleRoundTo(1234567, 3) 1234000
    SimpleRoundTo(1.234, -2) 1.23
    SimpleRoundTo(1.235, -2) 1.24
    SimpleRoundTo(-1.235, -2) -1.23
      

  17.   

    RoundTo函数
    type TRoundToRange=-37..37;
    Function RoundTo(const AValue:Double;const ADigit:TRoundToRange):Double;该函数利用银行业舍入法将浮点数四舍五入为指定的阿拉伯数字或10的幂数。AValue参数为待转换的值。ADigit指定要将AValue值四舍五入成的10的幂数,可以是-37到37之间的任何值。
    该函数的行为可能受Set8087CW过程或SetRoundMode函数的影响。
      

  18.   

    我一直用Format函数,搭配StrToFloat涵数,很方便
      

  19.   

    是下面的意思么?试试,
    var
    a:int;
    b:float;
    a:= b+0.5;
      

  20.   

    呵呵,什么怪呀?ROUND四舍五入和中国人的对不起来那是因为外国人的习惯不同呀!
      

  21.   

    不公Delphi如此,VB如此,好象其它程序语言都是如此
      

  22.   

    SQL server 中 Round的用法是四舍五入,Delphi中Round是银行家算法.
      

  23.   

    formatfloat('0.00',0.535);  //结果 0.54
    formatfloat('0.00',0.545);  //结果 0.55
    可以说明是真正的四舍五入。
      

  24.   

    告诉你一个Delphi API: RoundTo恰能满足你的需要