Domanda

Sto usando Java e mi riferisco al "doppio" tipo di dati. Per farla breve, sto leggendo alcuni valori dall'input standard che ho letto nel mio codice come doppi (preferirei piuttosto usare qualcosa come BigInteger ma in questo momento non è possibile).

Mi aspetto di ottenere doppi valori dall'utente, ma a volte potrebbero inserire elementi come: 999999999999999999999999999,9999999999 che penso sia al di là di una rappresentazione accurata per il doppio e viene arrotondato a 1.0E27 (probabilmente).

Vorrei ottenere alcuni suggerimenti su come rilevare se un valore specifico non sarebbe in grado di essere rappresentato con precisione in un doppio e richiederebbe arrotondamenti (in modo da poter rifiutare quel valore o altre azioni simili).

Grazie mille

È stato utile?

Soluzione

La maggior parte dei valori inseriti dagli umani non sarà esattamente rappresentabile con un doppio.

Ad esempio, vuoi impedire all'utente di inserire 0.1? Non è esattamente rappresentabile come doppio.

Per trovare la scala dell'errore, potresti fare qualcosa del tipo:

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

Quindi controlla se " errore " è tollerabilmente piccolo.

Altri suggerimenti

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

Non puoi usare un doppio per memorizzare qualcosa esattamente nel modo che stai chiedendo, molto raramente un utente può inserire un numero che un doppio può rappresentare perfettamente, ma sarebbe solo una coincidenza. Se è necessario memorizzare il numero esatto, è possibile utilizzare una stringa purché non sia necessario eseguire alcuna manipolazione. Se hai bisogno di qualcosa di più, probabilmente ci sono librerie create per quel tipo di matematica precisa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top