7,763
社区成员
发帖
与我相关
我的任务
分享
String __fastcall of_yxsz46(double Sz,int YXWS)
{
/* 设置特定数值(sz)的有效位数 */
/* Sz:数值;ysws:有效位数; Fh:符号; jw:进位标志 */
String Csz ,Csz1 ,Csz2 ,Fh ="";
int Is_Point=0,j ,L0=0;
String RetVal;
Boolean Jw = False;
double csz=Sz;
if(Sz < 0) // 保存符号
{
Fh = '-';
Sz = - Sz;
}
Csz =FloatToStr(Sz).Trim();
int LEN=Csz.Length();
if (Csz.Pos("E")>0)
{
if (Csz.SubString(Csz.Pos("E")+1,1)=="-")
{
int fcs=StrToInt(Csz.SubString(Csz.Pos("E")+2,LEN-(Csz.Pos("E")+1)));
String str="0.";
for (int j=1;j<fcs;j++)
str=str.Trim()+"0";
Csz=str.Trim()+Csz.SubString(1,Csz.Pos(".")-1)+Csz.SubString(Csz.Pos(".")+1,Csz.Pos("E")-(Csz.Pos(".")+1));
}
else if (Csz.SubString(Csz.Pos("E")+1,1)=="+")
{
int zcs=StrToInt(Csz.SubString(Csz.Pos("E")+2,LEN-(Csz.Pos("E")+1)));
int zws=Csz.Pos("E")-Csz.Pos(".");
if (zcs-zws>=0)
{
String str="";
for (int j=1;j<=(zcs-zws);j++)
str=str.Trim()+"0";
Csz=Csz.SubString(1,Csz.Pos(".")-1)+Csz.SubString(Csz.Pos(".")+1,Csz.Pos("E")-(Csz.Pos(".")+1))+str.Trim();
}
else
Csz=Csz.SubString(1,Csz.Pos(".")-1)+Csz.SubString(Csz.Pos(".")+1,zcs)+"."+Csz.SubString(Csz.Pos(".")+1+zcs,Csz.Pos("E")-(Csz.Pos(".")+1+zcs));
}
}
LEN=Csz.Length();
for (int i=0;i<LEN;i++) // 小数点的位置
{
if (Csz.SubString(i+1,1)==".")
{
Is_Point=i+1;
break;
}
}
if (Is_Point<LEN)
Csz=Csz.SubString(1,Is_Point-1).Trim()+Csz.SubString(Is_Point+1,LEN-Is_Point).Trim(); // 去除小数点
for (int i=0;i<LEN;i++)
{
if (Csz.SubString(i+1,1)!="0")
{
L0=i;
break;
}
}
if (L0>0) // 去除左边的零
Csz=Csz.SubString(L0+1,LEN-L0).Trim();
Csz1=Csz.SubString(1,YXWS).Trim();
Csz2=Csz.SubString(YXWS+1,LEN-YXWS).Trim(); // 有效位的右边
if (Csz2=="")
{
if (Is_Point==0)
{
if (Csz1.Length()<YXWS)
{
String str;
for (int i=1;i<=YXWS-Csz1.Length();i++)
str=str+"0";
return FloatToStr(csz)+"."+str.Trim();
}
else
return FloatToStr(csz);
}
else
{
if (Csz1.Length()<YXWS)
{
String str;
for (int i=1;i<=YXWS-Csz1.Length();i++)
str=str+"0";
for (int i=0;i<=L0-1;i++)
RetVal=RetVal+"0";
RetVal=RetVal+Csz1+Csz2;
if (Is_Point>0) // 放入小数位
{
if (L0+YXWS<Is_Point)
RetVal=RetVal.SubString(1,Is_Point-1);
else
RetVal=RetVal.SubString(1,Is_Point-1)+"."+RetVal.SubString(Is_Point,L0+YXWS-Is_Point+1);
}
return RetVal+str.Trim();
}
else
{
for (int i=0;i<=L0-1;i++)
RetVal=RetVal+"0";
RetVal=RetVal+Csz1+Csz2;
if (Is_Point>0) // 放入小数位
{
if (L0+YXWS<Is_Point)
RetVal=RetVal.SubString(1,Is_Point-1);
else
RetVal=RetVal.SubString(1,Is_Point-1)+"."+RetVal.SubString(Is_Point,L0+YXWS-Is_Point+1);
}
return RetVal;
}
}
}
int jwsz=StrToInt(Csz2.SubString(1,1)); // 有效位的右边
int jwsz1 = StrToInt(ReverseString(Csz1).SubString(1,1)); //四舍六入
if (jwsz==0||jwsz==1||jwsz==2||jwsz==3||jwsz==4) // 判断是否进位
Jw=false;
else if (jwsz==5||jwsz==6||jwsz==7||jwsz==8||jwsz==9)
Jw=true;
if (Jw==true) // 有进位
{
int i;
for (i=1;i<=Csz1.Length();i++)
{
if (Csz1.SubString(i,1)!="9")
break;
}
if (i>Csz1.Length()&&L0<1)
{
Is_Point++;
L0--;
}
else if (L0>=1&&i>Csz1.Length())
L0--;
Csz1=IntToStr(StrToInt(Csz1)+1);
if((jwsz1 % 2==0) && (jwsz==5))Csz1=IntToStr(StrToInt(Csz1)-1);
String str="";
for (int t=1;t<=Csz2.Length();t++)
str=str+"0";
Csz2=str.Trim();
}
else
{
String str="";
for (int t=1;t<=Csz2.Length();t++)
str=str+"0";
Csz2=str.Trim();
}
for (int i=0;i<=L0-1;i++)
RetVal=RetVal+"0";
RetVal=RetVal+Csz1+Csz2;
if (Is_Point>0) // 放入小数位
{
if (L0+YXWS<Is_Point)
RetVal=RetVal.SubString(1,Is_Point-1);
else
RetVal=RetVal.SubString(1,Is_Point-1)+"."+RetVal.SubString(Is_Point,L0+YXWS-Is_Point+1);
}
if (RetVal.Length()<YXWS) // 不足有效位补0
{
String str;
for (int i=1;i<=YXWS-RetVal.Length();i++)
str=str+"0";
RetVal=RetVal+"."+str.Trim();
}
RetVal=Fh+RetVal;
if(RetVal.SubString(RetVal.Length(),1)==".")
RetVal=RetVal.SubString(1,RetVal.Length()-1);
return RetVal;
}