我現在要處理的數字這種形式:9.062705115038622E-4 或者-0.0018839088514177576 因為比較大用double 就不行了,比double 能存盤的是extended吧?我現在要把以上數字的字串轉成extended型別再存在陣列中,可是strtofloat截取之后精度就變了,比如說: 0.0022783474240102275用strtofloat后就是0.002278347424只有前12位。怎么辦呢?
我還試了用val,結果還是一樣只能截取到字串的前12位,我該怎么辦呢????求給位大神幫忙啊!!!!!!!!!
uj5u.com熱心網友回復:
還是不要轉吧 直接把string存盤到陣列不一樣嗎?uj5u.com熱心網友回復:
delphi32是沒有問題的,delphi64中extended=double,所以精度就達不到19/20位了,但是double也有15/16位,不會只有12位。測驗:
var
s: string;
x: extended;
begin
s := '0.0022783474240102275';
x := StrToFloat(s);
writeln(x:0:19);
end;
uj5u.com熱心網友回復:
存進陣列,然后再取出來還是你這個數啊var
s: string;
dd: Extended;
Str: string;
vD: array[1..5] of Extended;
begin
s := '0.0022783474240102275';
dd:= StrToFloat(s);
vD[2]:= dd;
Str:= FormatFloat('0.000000000000000000000000000000', vD[2] );
end;
uj5u.com熱心網友回復:
直接轉不行嗎 strtofloatuj5u.com熱心網友回復:
謝謝你的回復,我可能沒表達明白,我現在要處理的數是存在記事本中的字符,9.062705115038622E-4 或者-0.0018839088514177576 這種形式,里面有e的,我取出來可以放在陣列中,但是我得將這么小的數乘上一個小數(結果就變更小了),然后再存起來,這樣得到多個結果后再將極其小的數(類似這種形式:9.062705115038622E-4 或者-0.0018839088514177576)比較求得最大的數。我可以適當降低精度以保證計算速度,現在的難題是這種數中有e,無法直接截取前XXX位,上面的數是java生成的,到了delphi上就不好處理了,我還要將他們乘上小數再求和再排序,有什么好的思路嗎?謝謝啦!
uj5u.com熱心網友回復:
謝謝你的回復,我可能沒表達明白,我現在要處理的數是存在記事本中的字符,9.062705115038622E-4 或者-0.0018839088514177576 這種形式,里面有e的,我取出來可以放在陣列中,但是我得將這么小的數乘上一個小數(結果就變更小了),然后再存起來,這樣得到多個結果后再將極其小的數(類似這種形式:9.062705115038622E-4 或者-0.0018839088514177576)比較求得最大的數。我可以適當降低精度以保證計算速度,現在的難題是這種數中有e,無法直接截取前XXX位,上面的數是java生成的,到了delphi上就不好處理了,我還要將他們乘上小數再求和再排序,有什么好的思路嗎?謝謝啦!
uj5u.com熱心網友回復:
一、Extended 超長浮點數范圍 -3.6 x 10^–4951 ~ 1.1 x 10^4932
精度 19..20
二、你將 資料轉為Extended,是要損失精度的
比如 -0.0018839088514177576
保存在Extended 實際值為 -0.00188390885141776(超過19位的四舍五入)
三、你的問題,涉及到高精度的計算
建議使用下列陣列保存資料
A:array [-100..100] of byte;
-110..0保存小數點前資料
-1..-100保存小數點后資料
這樣,可以加減乘除和比較運算,就是需要轉換。(主要是按位進行運算)
uj5u.com熱心網友回復:
大半年還沒解決?這種問題也算個事...
var
x: extended;
begin
x := 9.062705115038622E-4; // x := StrToFloat('9.062705115038622E-4');
writeln(FormatFloat('0.###################', x));
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58216.html
標籤:語言基礎/算法/系統設計
