procedure TForm1.Button12Click(Sender: TObject);
var vf:Double;
    vi64:Integer;
begin
  // vf := strtofloatdef(edit1.Text,0);
  vf := 2.01;
  vf := vf * 1000;
  vi64 := Trunc(vf);
  showmessagefmt('%D',[vi64]);
end;大家帮忙运行上面的代码,给个方法解决这个问题?
我本意是想取一个有3位小数的浮点数,结果不正确,如何解?

解决方案 »

  1.   

    var
      vf:single;
      //vi64:Integer;
    begin
      // vf := strtofloatdef(edit1.Text,0);
     // vf := 2.01;
      vf := 2.01 * 1000;
      //vi64 := Trunc(vf);
      showmessagefmt('%.3f',[vf]);
      

  2.   

    谢谢minizhuxianchun!
    我不是要显示数字的意思,又不想把浮点数化到字符串,再把字符串化到整数,想直接从数字运算中得到var vss:String;
          vf:double;
          vii:Integer;
    begin
      vf := 2.01 * 1000;
      vss := format('%.0f',[vf]); // 不想用此二行的转化方法
      vii := strtointdef(vss,0); // 不想用此二行的转化方法
      showmessagefmt('%D',[vii]);
    end;
      

  3.   

    var vf:Double;
        s:string;
    begin
      vf := 2.01;
      s:=format('%6.3f ',[vf]);
      showmessage(s);
    end;
      

  4.   

    var
      f: integer;
    begin
      f:=trunc(2.01 * 1000);
      showmessagefmt('%d',[f]);
    end;
      

  5.   

    不要拆开,应该放一起,即:trunc(2.01*1000)因为计算机只有0,1;在存储vf := 2.01;时,不是刚好在Double精度内就保存的下,后面有被舍去的数
    而再转换成10进制去计算时,就会变成2.009999999999这样子了
      

  6.   

    function myTrunc(pNum:Double;const pAberration:Double=0.000001):Int64;
    begin
      if pNum >= 0 then Result := Trunc(pNum + pAberration)
      else Result := Trunc(pNum - pAberration);
    end;用以上的方法,在不影响返回值的使用环境下,加个适当的偏差,经过测试,发现效果似乎不错。
    比如对于像素、金额来说,加上0.000001应该是没问题的。