我从数据库表中选择了列,希望只显示这些数据的两位小数。目前的代码如下:
SQL.Strings = ('select '#9'my_index '#9'his_index,'...
- 这个
#9
是什么意思? - 我该如何处理选定的数据,使其保留两位小数?
我对Delphi非常陌生。
#9
代表ASCII编码值为9的字符,即制表符(TAB)。
如果您想将浮点数值转换为保留2位小数的字符串,可以使用其中一个格式化函数,例如Format()
:
var
d: Double;
s: string;
...
d := Sqrt(2.0);
s := Format('%.2f', [d]);
function Round2(aValue:double):double;
begin
Round2:=Round(aValue*100)/100;
end;
0.0999
不会变成 0.09
而是变成了 0.10
。 - AmigoJack#9
是制表符。
如果 f
是一个浮点数变量,你可以使用 FormatFloat('#.##', f)
来获得一个字符串表示形式的 f
,其中小数点后最多只有 2 位。
如今,SysUtils单元包含了该解决方案:
System.SysUtils.FloatToStrF( singleValue, 7, ffFixed, 2 );
System.SysUtils.FloatToStrF( doubleValue, 15, ffFixed, 2 );
如果所需的小数点/千位分隔符与当前系统区域设置不同,您可以传递+1 TFormatSettings参数。
对于分隔符后的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;
n
为1
或更高时有效,对于_零_小数位无效。 - AmigoJack关于浮点数保留两位小数的四舍五入检查,请参考this中的文档。文档提供了足够的示例,使用银行家舍入法。
x := RoundTo(1.235, -2); //gives 1.24
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;
内部浮点格式例程仅适用于大于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。
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;