質問

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

この値をテキストボックスに表示し、それを取り出して double に変換し直すと同じ値になるようにしたいと考えています。でもいつも下二桁を失ってしまう

私は次のことを試しました:

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 桁の精度を維持する方法はありますか?

役に立ちましたか?

解決

「R」を使用する 数値フォーマット文字列:

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

R 「往復」の略です。リンクされたドキュメントから:

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

余談ですが、これらの下 2 桁を保持する方法はないと思われます。利用できる精度には限界があり、それが実現できるとは思えません。 d そもそも。ただし、文字列が少なくとも正確に読み取っていることを確認することはできます。

本当に追加の精度が必要な場合は、 decimal その代わり。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top