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

41ik7eoe  于 2023-01-13  发布在  其他
关注(0)|答案(9)|浏览(804)

我从数据库表中选择了列,并希望此数据只保留两位小数。我有:

SQL.Strings = ('select '#9'my_index '#9'his_index,'...
  • 那是什么?
  • 如何处理我选择的数据,使其只保留两位小数?

我刚到 Delphi 。

hkmswyz6

hkmswyz61#

#9是代码为9的字符TAB。
如果你想把一个浮点值转换成一个有2个小数位的字符串,你可以使用一个格式化函数,例如Format()

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

kpbpu0082#

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

4urapxun3#

#9是制表符。
如果f是浮点变量,则可以执行FormatFloat('#.##', f)以获得f的字符串表示形式,小数位数不超过2位。

khbbv19g

khbbv19g4#

对于浮点到浮点(比如小数点后2位)舍入检查this来自文档。也给出了足够的例子。它使用银行家舍入。

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

请注意,简单地截断到两位小数(如Format())、舍入到整数和舍入到浮点数是有区别的。

jogvjijk

jogvjijk5#

现在,SysUtils单元包含以下解决方案:

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

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

bz4sfanl

bz4sfanl6#

内部浮点格式例程仅适用于大于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;

因此,如果位数=2,则1.2349舍入为1.23,1.2349E-17舍入为1.23E-17

ee7vknir

ee7vknir7#

这对我很有效:

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;
8iwquhpp

8iwquhpp8#

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;
wa7juj8i

wa7juj8i9#

对于分隔符后面的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;

相关问题