Frage

In C #. Ich habe ein Doppel (die ich aus einer Datenbank extrahiert haben), die 20-stellige Präzision hat. In Visual Studio (mit Schnellüberwachung) kann ich den Wert der Doppel zu sehen sein = 0,00034101243963859839.

Ich möchte in einem Textfeld diesen Wert anzuzeigen, und dann haben sie den gleichen Wert sein, wenn ich es aus und wandeln es wieder in ein Doppelzimmer. Aber ich verliere immer die letzten beiden Ziffern

Ich habe versucht, die folgenden:

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();

In diesen Fällen:

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

Ich möchte in der Lage sein, die folgenden Aufgaben:

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

Gibt es eine Möglichkeit, die letzten beiden Ziffern der Präzision zu halten ??

War es hilfreich?

Lösung

Mit der "R" numerischen Format-String :

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

Die R steht für "Round-Trip". Aus dem verknüpften Dokument:

  

Dieses Format wird nur für den Einzel- und Doppel-Typen unterstützt. Der Round-Trip-Spezifizierer garantiert, dass ein numerischer Wert in einen String umgewandelt wird wieder in den gleichen numerischen Wert analysiert werden.

Als beiseite, ich vermute, es gibt keinen Weg, um die letzten beiden Ziffern zu halten. Es gibt nur so viel Präzision zur Verfügung, und ich bezweifle, dass sie es jemals in d in erster Linie machen. Aber Sie können Ihre Zeichenfolge zumindest liest zurück stellen Sie sicher, was Sie richtig haben.

Wenn Sie wirklich die zusätzliche Präzision benötigen, können Sie versuchen, eine decimal stattdessen verwenden.

Andere Tipps

Nein. Neben der Tatsache, dass doppelt so hoch ist binär und daher nicht gut für Dezimalzahlen, verdoppelt haben maximal 15/16 Dezimalziffern (53 Bits). dezimal hat maximal 28/29 Ziffern (96 Bit), so wäre es in Ordnung, es zu benutzen. Wenn Sie höhere Genauigkeiten in der Datenbank haben, müssen Sie eine eigene bignum Klasse für C #, suchen in Stackoverflow für Implementierungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top