1. ホーム
  2. c#

[解決済み] 科学的記数法を用いない2倍から文字列への変換

2023-01-31 10:06:58

質問

.NET Frameworkでdoubleを科学的記数法のない浮動小数点文字列表現に変換する方法は?

"Small"サンプル(有効数字は任意の大きさでよい、例えば 1.5E200 または 1e-200 ) :

3248971234698200000000000000000000000000000000
0.00000000000000000000000000000000000023897356978234562

どの 標準的な数値フォーマット はこのようなものであり カスタムフォーマット では、小数点以下の桁数を自由に設定することはできないようです。

とは重複しません。 10の累乗表現なしでdoubleを文字列に変換する方法(E-05) というのは、そこで示された答えが ではなく は手元の問題を解決していません。この問題で受け入れられた解決策は、固定小数点(20桁など)を使用することでしたが、これは私が望むものではありません。固定幅の最大幅は99文字なので、固定ポイントのフォーマットと冗長な0をトリミングしても、問題は解決しません。

注意してください。 は、独自の数値フォーマット (たとえば、カルチャー情報に依存する他の小数点セパレータ) を正しく処理する必要があります。

編集してください。 質問は本当に前述の数値の変位についてのみです。私は浮動小数点数がどのように動作し、どのような数値が使用され、計算されるかを知っています。

どのように解決するのですか?

汎用的¹な解決策としては、339の場所を保存する必要があります。

doubleValue.ToString("0." + new string('#', 339))

ゼロでない小数点以下の桁数は最大16桁です。15は小数点の右側にあります。指数はこの15桁を最大324桁右側に移動させることができます。( 範囲と精度を参照してください。 )

に対して動作します。 double.Epsilon , double.MinValue , double.MaxValue と、その中間に位置するものです。

すべてのフォーマットと文字列の作業は、管理されていないCLRコードによって1つのパスで行われるため、パフォーマンスは正規表現/文字列操作のソリューションよりもはるかに大きくなります。また、コードが正しいことを証明するのもはるかに簡単です。

使いやすさとさらに良いパフォーマンスのために、それを定数にします。

public static class FormatStrings
{
    public const string DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################";
}

¹ 更新しました。 私は誤って、これもロスレスソリューションであると言いました。実際はそうではありません。 ToString を除くすべてのフォーマットに対して通常の表示丸めを行うからです。 r . ライブの例です。 ありがとう、@Loathing! ご覧ください Lothing さんの回答 をご覧ください。固定小数点表記でラウンドトリップする機能が必要な場合(つまり .ToString("r") を使用している場合など)。