如何在Delphi中保留两位小数?

6

我从数据库表中选择了列,希望只显示这些数据的两位小数。目前的代码如下:

SQL.Strings = ('select '#9'my_index '#9'his_index,'...
  • 这个 #9 是什么意思?
  • 我该如何处理选定的数据,使其保留两位小数?

我对Delphi非常陌生。


数据库中是什么数据类型?在 Delphi 中你有什么字段类型?您需要将数据作为字符串还是需要它作为数字类型,只保留两个小数位? - Cosmin Prund
9个回答

21

#9代表ASCII编码值为9的字符,即制表符(TAB)。

如果您想将浮点数值转换为保留2位小数的字符串,可以使用其中一个格式化函数,例如Format()

var
  d: Double;
  s: string;
...
d := Sqrt(2.0);
s := Format('%.2f', [d]);

7
function Round2(aValue:double):double;    
begin    
  Round2:=Round(aValue*100)/100;    
end;

这不是“保留”两位小数,而是“改变”它们:0.0999 不会变成 0.09 而是变成了 0.10 - AmigoJack
你所说的不是四舍五入,而是截取到小数点后两位。 - RTS
没错。你从哪里得到的这个想法,认为OP/问题需要四舍五入?因为被接受的答案也进行了四舍五入?但是OP可能并不知道这一点。 - AmigoJack
好的,我的错 :) - RTS

4

#9 是制表符。

如果 f 是一个浮点数变量,你可以使用 FormatFloat('#.##', f) 来获得一个字符串表示形式的 f,其中小数点后最多只有 2 位。


哦...你们互相竞争!感谢你们俩! - spspli

1

如今,SysUtils单元包含了该解决方案:

System.SysUtils.FloatToStrF( singleValue, 7, ffFixed, 2 );
System.SysUtils.FloatToStrF( doubleValue, 15, ffFixed, 2 );

如果所需的小数点/千位分隔符与当前系统区域设置不同,您可以传递+1 TFormatSettings参数。


1

对于分隔符后的N个位置,请使用

function round_n(f:double; n:nativeint):double;
var i,m : nativeint;
begin
  m := 10;
  for i := 1 to pred(n) do
    m := m * 10;

  f := f * m;
  f := round(f);
  result := f / m;      
end;

仅在n1或更高时有效,对于_零_小数位无效。 - AmigoJack

1

关于浮点数保留两位小数的四舍五入检查,请参考this中的文档。文档提供了足够的示例,使用银行家舍入法。

x := RoundTo(1.235, -2); //gives 1.24

请注意,仅仅将数字截断到两位小数(例如在Format()函数中),四舍五入到整数和四舍五入到浮点数之间存在差异。

0
这对我有用:
Function RoundingUserDefineDecaimalPart(FloatNum: Double; NoOfDecPart: integer): Double;
Var
     ls_FloatNumber: String;
Begin
     ls_FloatNumber := FloatToStr(FloatNum);
     IF Pos('.', ls_FloatNumber) > 0 Then
          Result := StrToFloat
            (copy(ls_FloatNumber, 1, Pos('.', ls_FloatNumber) - 1) + '.' + copy
                 (ls_FloatNumber, Pos('.', ls_FloatNumber) + 1, NoOfDecPart))
     Else
          Result := FloatNum;
End;

0

内部浮点格式例程仅适用于大于1的简单数字

您需要做一些更复杂的事情,以实现通用的小数位限制器,该限制器可以正确地处理固定点和科学计数法下小于1的值。

我使用这个例程

function TForm1.Flt2str(Avalue:double; ADigits:integer):string;
var v:double; p:integer; e:string;
begin
  if abs(Avalue)<1 then
  begin
    result:=floatTostr(Avalue);
    p:=pos('E',result);
    if p>0 then
    begin
      e:=copy(result,p,length(result));
      setlength(result,p-1);
      v:=RoundTo(StrToFloat(result),-Adigits);
      result:=FloatToStr(v)+e;
    end else
      result:=FloatToStr(RoundTo(Avalue,-Adigits));
  end
  else
    result:=FloatToStr(RoundTo(Avalue,-Adigits));
end;

所以,当 digits=2 时,1.2349 四舍五入为 1.23 和 1.2349E-17 四舍五入为 1.23E-17。


0
Function RealFormat(FloatNum: Double): string;
Var
     ls_FloatNumber: String;
Begin
     ls_FloatNumber:=StringReplace(FloatToStr(FloatNum),',','.',[rfReplaceAll]);
     IF Pos('.', ls_FloatNumber) > 0 Then
          Result :=
            (copy(ls_FloatNumber, 1, Pos('.', ls_FloatNumber) - 1) + '.' + copy
                 (ls_FloatNumber, Pos('.', ls_FloatNumber) + 1, 2))
     Else
          Result := FloatToStr(FloatNum);
End;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接