C'è un modo per impostare un 'accuratezza globale' per tutti i calcoli BigDecimal?
No.
Dovrete creare una classe wrapper che ha una MathContext
come attributo in più. Sarà necessario:
uso questo mc
per ogni operazione matematica che altrimenti utilizzare la semantica di default, e
creare e restituire un altro caso avvolto ogni volta che l'operazione avvolto restituisce un'istanza regolare.
(Come variante, è possibile implementare un 'globale' MathContext
utilizzando una statica, ma avrai ancora bisogno di usare wrappering per garantire che il mc
viene utilizzato.)
(estensione BigDecimal
sarebbe . lavoro troppo, e che è più ordinato sostenibile di una classe wrapper)
Hai detto che in un commento:
Non voglio davvero scrivere il mio modulo Decimal, voglio solo capire perché BigDecimal è così poco collaborativo.
(domande di design può rispondere solo definitivamente dal team di progettazione. Tuttavia ...)
Come per tutte le classi di utilità complicate, la progettazione di BigDecimal è un compromesso che è stato progettato per soddisfare le requisiti di una vasta gamma di casi d'uso. È anche un compromesso tra le meta-esigenze in competizione (parola sbagliata) di "potenza" e "semplicità".
Quello che hai è un caso d'uso che non è particolarmente ben supportato. Ma sospetto che se fosse ben supportato (ad esempio con un globale MathContext
che controlla tutto o uno MathContext
collegato a ciascun BigDecimal
), ciò introdurrebbe ogni sorta di altre complessità; per esempio. occuparsi di operazioni in cui sono presenti due o più oggetti contestuali concorrenti da considerare. Tali problemi potrebbero essere affrontati ... ma sono suscettibili di portare a "sorprese" per il programmatore, e questa non è una buona cosa.
L'approccio attuale è semplice e facile da capire e, se hai bisogno di qualcosa di più complicato, puoi implementarlo ... fornendo esplicitamente un MathContext
per le operazioni che lo richiedono.
fonte
2012-04-08 04:28:25
Questo è esattamente quello che voglio evitare. –
In realtà sto riscontrando qualche difficoltà nell'utilizzo dell'estensione di classe. Se ho 2 BigDecimals che rappresentano "1" e "3", entrambi hanno scala impostata su 120 ... Divisione "1" per "3" produce ancora un decimale non terminante, anche se assegno il risultato su una scala di 120 pure! (che era quello che cercavo di evitare in origine, parametri extra per le operazioni matematiche). –
Penso che sia possibile risolvere il problema sovrascrivendo il metodo 'divide' per la classe. – trutheality