La classe BigDecimal
ha alcuni metodi utili per garantire la conversione senza perdita di dati:
byteValueExact()
shortValueExact()
intValueExact()
longValueExact()
Tuttavia, i metodi floatValueExact()
e doubleValueExact()
non esistono.
Ho letto il codice sorgente OpenJDK per i metodi floatValue()
e doubleValue()
. Entrambi sembrano ripiegare su Float.parseFloat()
e Double.parseDouble()
, rispettivamente, che possono restituire l'infinito positivo o negativo. Ad esempio, l'analisi di una stringa di 10.000 9s restituirà l'infinito positivo. A quanto ho capito, BigDecimal
non ha un concetto interno di infinito. Inoltre, analizzando una stringa di 100 9s come double
dà 1.0E100
, che non è infinito, ma perde precisione.
Che cos'è un'implementazione ragionevole floatValueExact()
e doubleValueExact()
?
Ho pensato a una double
soluzione combinando BigDecimal.doubleValue()
, BigDecial.toString()
, Double.parseDouble(String)
e Double.toString(double)
, ma sembra disordinato. Voglio chiedere qui perché potrebbe (deve!) Esserci una soluzione più semplice.
Per essere chiari, non ho bisogno di una soluzione ad alte prestazioni.