Frage

Ich bin mit Java und unter Bezugnahme auf den „doppelten“ Datentyp. Um es kurz zu halten, lese ich einige Werte aus der Standardeingabe, die ich als verdoppelt in meinem Code gelesen (ich würde viel lieber so etwas wie BigInteger verwenden, aber jetzt ist es nicht möglich).

Ich erwarte, dass doppelte Werte vom Benutzer zu erhalten, aber manchmal könnte sie Eingabe Dinge wie: 999999999999999999999999999,9999999999 was ich denke, ist darüber hinaus eine genaue Darstellung für Doppel und die bekommen gerundet auf 1.0E27 (wahrscheinlich).

Ich mag einige Hinweise bekommen, wie zu erkennen, ob ein bestimmte Wert nicht in der Lage sein würde, genau in einem Doppel vertreten zu sein und erfordern würde Rundung (so, dass ich diesen Wert oder andere solche Aktionen ablehnen konnte).

Danke schön

War es hilfreich?

Lösung

eingegeben Die meisten Werte von den Menschen nicht exakt darstellbar mit einem Doppel.

Zum Beispiel, haben Sie von dem Benutzer verhindern möchten, 0,1 eingeben? Das ist nicht gerade darstellbare als Doppel.

Um das Ausmaß des Fehlers zu finden, Sie etwas tun könnten, wie:

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

Dann prüfen, ob "Fehler" ziemlich klein ist.

Andere Tipps

double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();

Sie können keine Doppel verwenden, um etwas genau in der Art und Weise speichern Sie fragen, sehr selten ein Benutzer eine Nummer eingeben kann, die eine doppelte perfekt darstellen kann, aber das Zufall nur sein würde. Wenn Sie die genaue Zahl zu speichern, brauchen Sie eine Zeichenfolge verwenden, so lange, wie Sie eine Manipulation nicht tun müssen. Wenn Sie mehr benötigen, dann gibt es wahrscheinlich Bibliotheken, die für diese Art von präziser Mathematik gemacht werden.

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