要做一个功能:小数位的第二个的大于0则进位功能函数如下:function JWRound(x:real):Real;
var tmp:real;
begin
tmp:=x*10.00 ;
tmp:=tmp+0.90;
tmp:=Trunc(tmp);
//Result :=  Trunc(x * 10 + 0.9) / 10 ;
Result:= tmp / 10.00;end;但是个怪问题:如
X=592。31 结果就是 592。4
但输出结果是:592。3
tmp:=trunc(tmp)  结果为:5923不知是什么原因?急!!

解决方案 »

  1.   

    你這樣寫會有問題:
    592.31 實際 可能是592.309999999, 一個無限不循環小數,所以你這樣的算法有問題改為這樣:
    function JWRound(x:real):Real;  
    begin
      x:= x*10 ;
      x:= Ceil(x);
      Result:= x / 10;
    end;
      

  2.   

    那你用CEIL不会有问题?
    CEIL是一个往大的取我要加0。9
      

  3.   

    嗯....用ceil不符合你的需求那你不要加0.9 改為 加 0.9001或更多小數
      

  4.   

    我测试了你的代码,你为什么要用Tranc来取整呢?完全可以用以下函数来达到:function JWRound(x: real): Real;
    var
      tmp:real;
    begin
      tmp := x * 10.00 ;
      tmp := tmp + 0.90;
      //tmp := Trunc(tmp);
      //Result := Trunc(x * 10 + 0.9) / 10 ;
      Result := tmp / 10.00;
    end;在浮点型数据都是比较精度的
      

  5.   

    SQLDebug_Fan:你这种不会有问题吗?
    实数是个进似数,像楼上说的592.309999999
      

  6.   

    数据改用double类型?或者利用format函数中的%.xxf这样的格式转成String来判断?
      

  7.   

    数据改用double类型?或者利用format函数中的%.xxf这样的格式转成String来判断?
      

  8.   

    用Extended类型,80位精度浮点数
      

  9.   

    建议不要用real,double这种"不精确"的类型
    如果你的小数位<=4,那用Currency型比较好