web-dev-qa-db-ja.com

C#20桁の精度の倍精度を文字列に変換してから元に戻す

C#で。 20桁の精度のdouble(データベースから抽出したもの)があります。 Visual Studio(QuickWatchを使用)では、doubleの値が= 0.00034101243963859839であることがわかります。

この値をテキストボックスに表示し、取り出してdoubleに戻すときに同じ値にしたいのですが。しかし、私は常に最後の2桁を失います

私は以下を試しました:

double d = 0.00034101243963859839;
string s = d.ToString();
string s2 = d.ToString("F20");
string s3 = d.ToString("0.00000000000000000000"); -- 20 0's
string s4 = (d*100d).ToString();

これらの場合:

s = 0.000341012439638598 
 s2 = 0.00034101243963859800 
 s3 = 0.00034101243963859800 
 s4 = 0.0341012439638598

私は次のことができるようになりたいです:

double d = 0.00034101243963859839;
string s = d.ToString();
//...
double d2 = double.Parse(s);
if(d == d2)
{
  //-- Success
}

これらの最後の2桁の精度を維持する方法はありますか?

28
JohnM

「R」を使用 数値形式の文字列

double d = 0.00034101243963859839;
string s = d.ToString("R");
//...
double d2 = double.Parse(s);
if(d == d2)
{
  //-- Success
}

Rは「往復」を表します。リンクされたドキュメントから:

この形式は、シングルタイプとダブルタイプでのみサポートされています。ラウンドトリップ指定子​​は、文字列に変換された数値が解析されて同じ数値に戻されることを保証します。

余談ですが、最後の2桁を維持する方法はないと思います。利用できる精度はそれほど多くないので、そもそもdになるとは思えません。しかし、文字列が少なくともあなたが持っているものを正しく読み返すことを確認することができます。

本当に追加の精度が必要な場合は、代わりにdecimalを使用してみてください。

47
Joel Coehoorn

いいえ。doubleは2進数であるため、10進値には適していないという事実に加えて、doubleの最大小数点数は15/16桁(53ビット)です。 10進数の最大値は28/29桁(96ビット)なので、使用しても問題ありません。データベースの精度が高い場合は、C#用の独自のbignumクラスが必要です。実装については、stackoverflowを調べてください。

1
Thorsten S.