自己写了一个四舍六入,逢五奇进偶舍的函数。
function f(f:Double;k:Integer):Double;
var
  D:Double;
  i,m:Integer;
begin
  m:=1;
  for i:=0 to k-1 do
  begin
    m:=m*10;
  end;
  D:=Round(f*m)/m;
  Result:=D;
end;
f(0.12345,4)与Round(0.12345*10000)/10000)的结果确不同为什么出现这样的情况?错在那里?

解决方案 »

  1.   

    你将第二个Round(0.12345*10000)/10000)
    中的0.12345作为一个变量就可以了
    如:
    var  ss : double
    ss := 0.12345;
    round(ss*10000)这样就和第一个一样了,保持类型匹配
      

  2.   

    to:dabaicai
    直接用Round函数是没有问题的,问题是我自己的那个函数 D:=Round(f*m)/m;没有达到Round(0.12345*10000)/10000)的效果。问题是在这里为什么?
      

  3.   

    在有效位数上减个1就可以了,原来好像是说比如double型有效为16位小数的话,就是:
    0.12345实际上是0.1234500000000001
    把那个0.0000000000000001减掉就可以了,你试试
    就是在函数
    function f(f:Double;k:Integer):Double;
    var
      D:Double;
      i,m:Integer;
    begin
      m:=1;
      for i:=0 to k-1 do
      begin
        m:=m*10;
      end;
      D:=Round(f*m)/m; //这个f先-0.0000000000000001
      Result:=D;
    end;
      

  4.   

    to:还是没有达到(Round(0.12345*10000)/10000))四舍六入,逢五奇进偶舍的效果。
      

  5.   

    逢五奇进偶舍的效果。
    这个效果要你自己写代码处理吧
    至于上面的
     D:= f - 0.0000000000000001;
    result := Round(D*m)/m;
    已经达到了Round(0.12345*10000)/10000)这个效果吧
      

  6.   

    To:dabaicai你肯定没有测试过吧!
    比如:Round(0.12345*10000)/10000) ->0.1234
          Round(0.12355*10000)/10000) ->0.1236
          Round(0.123451*10000)/10000)->0.1235
    Round函数本身就符合逢五奇进偶舍只不过这个函数用起来不方便想改进一下,没得到想要的结果但是又找不出原因。
      

  7.   

    改了一下你的函数,实现了你上面说的要求,主要还是浮点型位数的问题
    function f(a:Double;k:Integer):Double;
    var
      D:Double;
      i,m:Integer;
    begin
      m:=1;
      for i:=0 to k-1 do
      begin
        m:=m*10;
      end;
      D:= a;
      Result:=Round(strtofloat(floattostr(d))*m)/m;;
    end;