La classe BigDecimalha 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, BigDecimalnon ha un concetto interno di infinito. Inoltre, analizzando una stringa di 100 9s come doubledà 1.0E100, che non è infinito, ma perde precisione.
Che cos'è un'implementazione ragionevole floatValueExact()e doubleValueExact()?
Ho pensato a una doublesoluzione 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.