Float 形式的计算(急, 送高分)(200分)

  • 主题发起人 主题发起人 duejihh
  • 开始时间 开始时间
D

duejihh

Unregistered / Unconfirmed
GUEST, unregistred user!
现要计算Float格式数据;
原数据: -.293132232323E-08, -.793243474385E-09, 0.847476349374E-08....
特点为表示负数时小数点前面的"0" 不表示, 即 "-0.****" -> "-.****"
但在实际计算是系统有把Float格式转换成"-0.****"(正数因格式相同所以不考虑);
我读Float格式数据是按字符长度读取的,因此导致无法得到正确的解,
请高手帮忙, 本人是菜鸟,,,呵
 
不明白说什么
如果是读文件的话
判定逗号分割的话
就读到一字符串,然后分解
开始,和逗号表示数据开始,
然后如果是- 后面可以是0也可以是.或者0..9
如果没有-,可以直接是数字,然后后面句号,后面数字,后面E,后面-后面数字
根据模式切
 
不明白你的问题所在
如果你需要格式一致的话,可以用format函数
 
其实很简单, 就是如何将计算后的指数形式数据(负数时)表示成: "-.**********E-**";
举例: -1.23456789E-07 > -.123456789E-08
不使用 bsense的判断后重新组合的方法,
想知道格式转换是有没有参数, 如: 用FloatToStrF(....)时
 
楼主给出的转换似乎有问题啊—— -1.23456789E-07 应该被转成 -.123456789E-06 才对。

function MyFloatStrFormat(const AStr: String):String;
var
Str:String;
n,e,x,m:Integer;
begin
Result:=AStr;
if Length(AStr)<3 then exit;
if AStr[1]<>'-' then exit; //非负数
e:=Pos('E',AStr);
if e=0 then exit; //非科学计数法的数字
if not TryStrToInt(Copy(AStr,e+1,MaxInt),x) then exit; //E之后的不是合法整数
Str:=Copy(AStr,2,e-2); //截取 - 与 E 之间的部分
while (Str<>'') and (Str[1]='0') do //消除数字的前导0
Delete(Str,1,1);
n:=Pos('.',Str);
if n=0 then //没有小数点,需在头部追加小数点
begin
n:=Length(Str);
Inc(x,n);
Str:='.'+Str;
end
else begin //有小数点
Inc(x,n-1);
Str:='.'+StringReplace(Str,'.','',[]);
end;
m:=Length(AStr)-e-1; //计算得到幂的位数
if x>=0 then
Result:=Format('-%sE+%.0'+IntToStr(m)+'d',[Str,x])
else
Result:=Format('-%sE-%.0'+IntToStr(m)+'d',[Str,-x]);
end;

测试过程如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=MyFloatStrFormat('-1.23456789E-07')
+' '+MyFloatStrFormat('-0.23456789E-07')
+' '+MyFloatStrFormat('-123456789E-07')
+' '+MyFloatStrFormat('-88.12E-127');
end;

测试结果:
-.123456789E-06 -.23456789E-07 -.123456789E+02 -.8812E-125
 
接受答案了.
 
后退
顶部