怎样让计算结果只保留两位小数点 怎样让计算结果只保留两位小数点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 V是实数类型,St是字符串:Str(V : 0 : 2, St);将V保留两个小数存储在St中.V是实数类型:V=Int(V*100+0.5)/100;将V四舍五入保留两个小数,不知道你是要哪个? var s:string; f:double; f:=1234.564231; s:=format('%8.2f',[f]); s:=formatfloat('0.00',f) var f:double;//前面计算ff:=strToFloat(format('0.2f',[f])); f:=round(f,-2);不但保留2位,而且4舍5入 edit1.Text:=Format('%.2f', [123.456]); function DRound(Value:double;cnt:integer):double;var fTmp:double; nTmp:double; k:int64;begin Result:=Value; nTmp:=Power(10.0,cnt); fTmp:=0.5; fTmp:=fTmp/nTmp; Result:=fTmp+Result; Result:=Result*nTmp; k:=0; asm fld qword ptr Result //__ftol begin push ebp mov ebp,esp LEA ESP,[ebp-$0c] wait fstcw word ptr [ebp-$04] wait mov al,[ebp-$03] or [ebp-$04],$00000c01 fldcw word ptr [ebp-$04] fistp qword ptr [ebp-$0c] mov [ebp-$03],al fldcw word ptr [ebp-$04] mov eax ,[ebp-$0c] mov edx,[ebp-$08] mov esp,ebp pop ebp //__ftol end push esp lea esp,k mov [esp],eax add esp,4 mov [esp],edx mov esp,ebp pop esp fild qword ptr k fstp qword ptr Result fld qword ptr nTmp fdivr qword ptr Result fstp qword ptr Result end;end; uses math==========非银行式四舍五入例: ShowMessage(FloatToStr(DRound(1.5352,3))); // 1.535 ShowMessage(FloatToStr(DRound(1.5352,2))); // 1.54 ShowMessage(FloatToStr(DRound(1.5352,1))); // 1.5 ShowMessage(FloatToStr(DRound(1.5352,0))); // 2========================银行四舍五入法则:逢单四舍五入例: round(1.565,2)=1.56 round(1.565,2)=1.58 更正一下代码,否则会引起溢出等意想不到的问题。=============================================uses math;function DRound(Value:double;cnt:byte):double;var fTmp:double; nTmp:double; k:int64;begin Result:=Value; if cnt>18 then exit; nTmp:=Power(10.0,cnt); fTmp:=0.5; fTmp:=fTmp/nTmp; Result:=fTmp+Result; Result:=Result*nTmp; k:=0; asm fld qword ptr Result //__ftol begin push ebp mov ebp,esp LEA ESP,[ebp-$0c] wait fstcw word ptr [ebp-$04] wait mov al,[ebp-$03] or [ebp-$04],$00000c01 fldcw word ptr [ebp-$04] fistp qword ptr [ebp-$0c] mov [ebp-$03],al fldcw word ptr [ebp-$04] mov eax ,[ebp-$0c] mov edx,[ebp-$08] mov esp,ebp pop ebp //__ftol end push esp lea esp,k mov [esp],eax add esp,4 mov [esp],edx mov esp,ebp pop esp fild qword ptr k fstp qword ptr Result fld qword ptr nTmp fdivr qword ptr Result fstp qword ptr Result end;end; 不过,也可以对系统Math里面的SimpleRoundTo做一下修改,效果是一样的,但是代码相对就简短许多//Code_Begin---------------------------function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange = -2): Double;var LFactor: Double;begin LFactor := IntPower(10, ADigit); Result := Trunc((AValue / LFactor) + 0.5) * LFactor;end;//Code_End-----------------------------//Code_Begin---------------------------////////////////////////////// SIMPLEROUND //////////////////////////////usesmath;function SimpleRound(const AValue: Double; const ADigit: TRoundToRange = -2): Double;var LFactor: Double;begin LFactor := IntPower(10, ADigit); Result := trunc(((AValue+0.51*LFactor) / LFactor) ) * LFactor;end;//Code_End----------------------------- 应届生~有个delphi公司想招我,但很远,有点怕,想了解下该公司情况~ 求解!playsound函数问题 求助:怎么判断这个节点是否还有子节点?谢谢 急求:DLL如何使用主程序的ADOConnection? 散分 关于自行开发文档格式的问题,请各位大侠帮帮忙,急。分不够解决问题后可另开贴追加。期待高手指点。 在fastReport中barCode为什么不能用?(帮帮忙啊~) 关于Tstringgrid控件(如何知道哪一行被选中) 关于TIWDatePicker1控件的问题? pop3接收邮件出现乱码问题 怎么使窗体的cursor统统改掉? 学海无涯,灌水无境。
Str(V : 0 : 2, St);
将V保留两个小数存储在St中.V是实数类型:
V=Int(V*100+0.5)/100;
将V四舍五入保留两个小数,不知道你是要哪个?
s:string;
f:double; f:=1234.564231;
s:=format('%8.2f',[f]);
s:=formatfloat('0.00',f)
f:double;
//前面计算f
f:=strToFloat(format('0.2f',[f]));
var
fTmp:double;
nTmp:double;
k:int64;
begin
Result:=Value;
nTmp:=Power(10.0,cnt);
fTmp:=0.5;
fTmp:=fTmp/nTmp;
Result:=fTmp+Result;
Result:=Result*nTmp;
k:=0;
asm
fld qword ptr Result
//__ftol begin
push ebp
mov ebp,esp
LEA ESP,[ebp-$0c]
wait
fstcw word ptr [ebp-$04]
wait
mov al,[ebp-$03]
or [ebp-$04],$00000c01
fldcw word ptr [ebp-$04]
fistp qword ptr [ebp-$0c]
mov [ebp-$03],al
fldcw word ptr [ebp-$04]
mov eax ,[ebp-$0c]
mov edx,[ebp-$08]
mov esp,ebp
pop ebp
//__ftol end
push esp
lea esp,k
mov [esp],eax
add esp,4
mov [esp],edx
mov esp,ebp
pop esp
fild qword ptr k
fstp qword ptr Result
fld qword ptr nTmp
fdivr qword ptr Result
fstp qword ptr Result
end;
end;
==========
非银行式四舍五入
例:
ShowMessage(FloatToStr(DRound(1.5352,3))); // 1.535
ShowMessage(FloatToStr(DRound(1.5352,2))); // 1.54
ShowMessage(FloatToStr(DRound(1.5352,1))); // 1.5
ShowMessage(FloatToStr(DRound(1.5352,0))); // 2========================
银行四舍五入法则:逢单四舍五入
例:
round(1.565,2)=1.56
round(1.565,2)=1.58
=============================================
uses
math;
function DRound(Value:double;cnt:byte):double;
var
fTmp:double;
nTmp:double;
k:int64;
begin
Result:=Value;
if cnt>18 then exit;
nTmp:=Power(10.0,cnt);
fTmp:=0.5;
fTmp:=fTmp/nTmp;
Result:=fTmp+Result;
Result:=Result*nTmp;
k:=0;
asm
fld qword ptr Result
//__ftol begin
push ebp
mov ebp,esp
LEA ESP,[ebp-$0c]
wait
fstcw word ptr [ebp-$04]
wait
mov al,[ebp-$03]
or [ebp-$04],$00000c01
fldcw word ptr [ebp-$04]
fistp qword ptr [ebp-$0c]
mov [ebp-$03],al
fldcw word ptr [ebp-$04]
mov eax ,[ebp-$0c]
mov edx,[ebp-$08]
mov esp,ebp
pop ebp
//__ftol end
push esp
lea esp,k
mov [esp],eax
add esp,4
mov [esp],edx
mov esp,ebp
pop esp
fild qword ptr k
fstp qword ptr Result
fld qword ptr nTmp
fdivr qword ptr Result
fstp qword ptr Result
end;
end;
function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange = -2): Double;
var
LFactor: Double;
begin
LFactor := IntPower(10, ADigit);
Result := Trunc((AValue / LFactor) + 0.5) * LFactor;
end;
//Code_End-----------------------------
//Code_Begin---------------------------
////////////////////////////
// SIMPLEROUND //
////////////////////////////
uses
math;
function SimpleRound(const AValue: Double; const ADigit: TRoundToRange = -2): Double;
var
LFactor: Double;
begin
LFactor := IntPower(10, ADigit);
Result := trunc(((AValue+0.51*LFactor) / LFactor) ) * LFactor;
end;
//Code_End-----------------------------