我在取三位小数的时候遇到这样的问题,
程序过程是这样的:
比如在edit1中输入数据然后在edit2中显示取三位小数的结果,在uses中添加math单元。
procedure TForm1.Edit1Change(Sender: TObject);
var a:string;
    b,c:real;
begin
    a:=edit1.Text;
    b:=strtofloat(a);
    c:=roundto(b,-3);
    edit2.Text:=floattostr(c);
end;
我在测试过程中处理几乎全部正确,唯独两个数字不能解决:0.0255,0.0355。
我问过许多人都不知道其中原因,请高手指点。有没有其它方法可以解决这种象限除了单独限制。

解决方案 »

  1.   

    procedure TForm1.Edit1Change(Sender: TObject);
    var a:string;
        b,c:real;
    begin
        a:=edit1.Text;
        b:=strtofloat(a);
        SetRoundMode(rmUp);   <---加一句
        c:=roundto(b,-3);
        edit2.Text:=floattostr(c);
    end;
      

  2.   

    procedure Tfrm_Catalogue.E_fcjgKeyPress(Sender: TObject; var Key: Char);
     Var
      tmp_str : string;
      I,PosI : Integer;
    begin
      inherited;
      If Not (Key In ['0'..'9',#8,#13,#46]) then
        begin
        Key := #0;
        MessageBeep(0);
        end;
      I := Pos('.',E_fcjg.Text);
      If I > 0 then
        begin
          If Not (Key In ['0'..'9',#8,#13]) then
            begin
              Key := #0;
              MessageBeep(0);
            end;
          PosI := E_fcjg.SelStart;
          If PosI < I then  //光标在'.'前面
            begin
               If Not ( Key In  ['0'..'9',#8,#13]) then
                  begin
                   Key := #0;
                   MessageBeep(0);
                  end;
            end
          else //光标在'.'后面
            begin
              tmp_str := Trim(Copy(E_fcjg.Text,I,3));
              If Length(tmp_str) + 1 > 3 then
                 begin
                 If Not ( Key In [#8]) then
                  key := #0;
                 end
              else
                begin
                  If Not ( Key In  ['0'..'9',#8,#13]) then
                    begin
                    Key := #0;
                    MessageBeep(0);
                   end;
                end;
              
            end;
        end;
    end;end.
    //我处理输入价格时候的壹段代码处理了2个小数位
      

  3.   

    var a:Doubleb:=format('%12.3f',[a])
      

  4.   

    to:Dlwxn(流云) 你的我试了一下不行,你再测试一下。
    to:coreblood(菜码....) 太长了,看不懂:))))
    to:azsoft(Try my best) 我还没理解你的意思,还在深刻体会。
    还有,之后用了0.0005之类的还是通过不了,望大家指点,为什么会出现这种现象。
    急用!!!!!!!!!!!!!!!!!
      

  5.   

    azsoft(Try my best) 的方法就是用来格式化字符串的好办法,就像C里面的 sprintf。
    具体参数可以查一下 Delphi 的帮助。'%12.3f'是一个格式,12位宽,小数点后保留3位的实数。[]中是要转换的数值。最好看帮助中的示例。
      

  6.   

    procedure TForm1.Edit1Change(Sender: TObject);
    begin
      Edit2.Text := FloatToStr(Trunc(StrToFloat(Edit1.Text) * 1000 + 0.5) / 1000);
    end;
      

  7.   

    coreblood(菜码....) 
    的方法如果用户粘贴怎么办。
      

  8.   

    self.Edit2.Text :=formatfloat('###0.000',strtofloat(self.Edit1.Text));
      

  9.   

    0.0255,0.0355不能解决?我试过可以解决啊!
    只不过delphi中采用的四舍五入方法为财务中的四舍五入方法!也就是说下一位如果刚好是5不进位!0.02551,0.035501都可以让它进位显示的!
      

  10.   

    delphi用的是银行的四舍五入算法,和我们知道的四舍五入不一样,这样遇到大数据量算起来比较精确。
    如果你非要按照数学中的四舍五入方法,简单处理方法如下:
    Value*100+0.5
    Trunc(Value)
    Value / 100
      

  11.   

    谢谢大家,我把Value*100+0.5
    Trunc(Value)
    Value / 100
    用到我的过程中测试通过了,感谢大家。
    我怎么给你们分分,你们太热情了。
      

  12.   

    to  FlashElf(闪)  呵呵,我的代码还有好些地方要完善的,只是给楼主看看看可以有个启示...
      

  13.   

    delphi用的是银行的四舍五入算法,和我们知道的四舍五入不一样,这样遇到大数据量算起来比较精确。
    如果是上面说的,那么0.0255,0.0355可以不进位,为何0.0455进位了