08. september 2001 - 11:14Der er
9 kommentarer og 1 løsning
FloatToStr() Uden e-formattering
Hej
Jeg arbejder på et projekt med nogle pænt store tal, der skal parses ind og ud af forskellige strings. Når jeg læser et atl ind og f.eks. sætter det i en stor potens og derefter konverterer det tilbage til en double igen, kommer det dog til at stå i et forkert format. F.eks: FloatToStr(Power(10,20)*2) giver et tal i stil med 2E+20 Kan denne formatering undgåes, så tallet i stedet bliver 200000000000000000000?
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
Jeg kan ikke få nogen af de to løsninger til at fjerne E\'et fra den. Jeg har prøvet var E: Extended begin e := power(10, 80) result := floattostrf(e, ffFixed, 18, 18); end; ...men det virker ikke. nogen specifikke løsninger?
Du skal bruge FormatFloat(), og så skal du sørge for at din format string indeholder der antal 0/# som du har plader før . dvs i dit eks. skal din format string indeholde 80 * #
Nope, den går ikke. Power(10,8) virker altid og den bliver også konverteret som 100000000, men lige så snart man kommer højt nok op, går det galt igen. Prøv bare dit eksempel med power(10,20)... det virker ikke, heller ikke selvom man sætter flere #\'er ind
Når du arbejder med double, har du kun en nøjagtighed på ca. 16 cifre, og det er derfor ikke relevant at udskrive det som \'normale\' tal idet 12345678901234567890 alligevel bliver til 12345678901234560000. FloatToStrF(e,ffFixed,18,0) vil virke på tal op til 18 cifre (0 positioner efter komma). Hvis du alligevel finder det interessant, må du selv lave en procedure. Du kan bruge følgende (den virker kun med heltal):
function DoubleToIntStr(x: double):string; {returnerer afrundet heltal af x (maks 255 cifre)} var Temp,E: string; Enum,Epos,i: integer; begin if abs(x) >= 1E18 then begin Temp := FloatToStrF(x,ffExponent,16,4); Epos := pos(\'E\',Temp); E:= copy(temp,Epos+1,length(temp)-Epos); Enum:= strToInt(E); delete(temp,Epos,10); delete(temp,pos(\',\',temp),1); delete(temp,pos(\'.\',temp),1); for i := 1 to 255-length(temp) do AppendStr(temp,\'0\'); if Enum >= 0 then begin if temp[1] = \'-\' then delete(temp,Enum+3,255) else delete(temp,Enum+2,255); result := temp; end else result := \'0\'; end else result := FloatToStrF(x,ffFixed,18,0); end;
kaldes som følger: var s: string; d: double; begin d := 1.2345E34; s := DoubleToStr(d); end;
Ok. Så har du bare ca. 20 cifre i stedet for 16, men for rigtig store tal må du stadig lave din egen procedure, jævnfør ovenstående. Du kan så bruge FloatToStrF(x,ffExtended,18,4), dvs 18 betydende cifre i proceduren. (FloatToStrF kan ikke håndtere mere) Såvidt jeg ved, er der ingen indbyggede procedurer som kan det du ønsker. Hvis du ændrer sidste linje til FloatToStrF(x,ffFixed,18,18) får du også nogle decimaler med.
Okay, den kan godt gå. Jeg har nu lavet systemet om til noget memory-fixeret, så tallene ligger i variablerne helt indtil de skal bruges, men svaret er jo godt nok alligevel :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.