Al lavoro, abbiamo riscontrato un problema durante il tentativo di dividere un numero elevato per 1000. Questo numero proviene dal database.Java's Bigdecimal.divide and rounding
Dire che ho questo metodo:
private static BigDecimal divideBy1000(BigDecimal dividendo) {
if (dividendo == null) return null;
return dividendo.divide(BigDecimal.valueOf(1000), RoundingMode.HALF_UP);
}
Quando faccio la seguente chiamata
divideBy1000(new BigDecimal("176100000"))
ricevo il valore atteso di 176100. Ma se provo la linea sotto
divideBy1000(new BigDecimal("1761e+5"))
Ricevo il valore 200000. Perché questo si verifica? Entrambi i numeri sono gli stessi con una rappresentazione diversa e l'ultimo è quello che ricevo dal database. Capisco che, in qualche modo, la JVM stia dividendo il numero 1761 per 1000, arrotondando e riempiendo di zero alla fine.
Qual è il modo migliore per evitare questo tipo di comportamento? Tieni presente che il numero originale non è controllato da me.
Perché si ottiene un BigDecimal dal database come stringa piuttosto che come BigDecimal in primo luogo? http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getBigDecimal%28int%29 –
Non lo so. Questo è stato il mio modo di semplificare l'esempio qui. Il codice originale utilizza il metodo getBigDecimal. –
Allora, dove nel tuo codice reale hai il problema di trasformare la stringa "1761e + 5" in un BigDecimal? Qual è il problema * attuale * nel tuo codice * effettivo *? –