DEFAULTFloatToStr関数の使用
FloatToStr('0.0000442615029219009')
出力
4.42615029219009E-5
小数点以下1桁をドロップ
FloatToStr('0.000442615029219009')
を生成します
0.000442615029219009
2番目のケースの値が出力されない理由を誰かが説明できますか
4.42615029219009E-4
DEFAULTFloatToStr関数の使用
FloatToStr('0.0000442615029219009')
出力
4.42615029219009E-5
小数点以下1桁をドロップ
FloatToStr('0.000442615029219009')
を生成します
0.000442615029219009
2番目のケースの値が出力されない理由を誰かが説明できますか
4.42615029219009E-4
のドキュメントにFloatToStr
は答えが含まれています:
変換には、有効数字 15 桁の一般的な数値形式が使用されます。
そのステートメントを解釈するには、関数を説明するトピックFormat
、特に一般的な数値形式に関するテキストも参照する必要があります (私の強調):
値は、固定形式または指数形式を使用して、可能な限り短い 10 進文字列に変換されます。結果の文字列の有効桁数は、書式文字列の精度指定子によって指定されます。精度指定子が存在しない場合、デフォルトの精度は 15 と見なされます。後続のゼロは結果の文字列から削除され、小数点は必要な場合にのみ表示されます。値の小数点の左側の桁数が指定された精度以下で、値が 0.00001 以上の場合、結果の文字列は固定小数点形式を使用します。それ以外の場合、結果の文字列は科学的形式を使用します。
残念ながら、ドキュメントは実際には間違っています。代わりに0.00001
を読む必要があります0.0001
。これは、次のプログラムによって示されます。
program FloatToStrScientificFixed;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
d: Double;
begin
d := 0.0001;
Writeln(FloatToStr(d*0.9999999));
Writeln(FloatToStr(d));
Writeln(FloatToStr(d*1.0000001));
Readln;
end.
あなたの例で0.0000442615029219009
は、より少ないので0.0001
、科学表記法を使用してフォーマットされています。ただし0.000442615029219009
、より大きい0.0001
ため、固定表記を使用して書式設定されます。
出力で常に科学表記法を使用する場合Format
は、e
書式文字列を使用します。
最初の例の仮数部の有効桁数が表示桁数を超えているため、次を参照してください。
書式設定をより細かく制御したい場合は、代わりに FloatToStrF 関数を使用してください。
EDIT : 桁数の説明が正しくありません。正しい説明については、David Hefferman の回答を参照してください。
ある時点FloatToStr
で、関数は指数形式に切り替わり、出力の文字数が制限されます。そうしないと、a を表示するDouble
ために最大 300 桁の 10 進数が必要になる場合があり、これは解釈には実用的ではありません。
関数を使用Format
して、厳密なルールを指定できます。