Se nella nostra applicazione Java dobbiamo fare calcoli in cui abbiamo numeri con la virgola, tipo calcoli scientifici e calcoli finanziari non dobbiamo utilizzare mai i tipi di dato a virgola mobile come float e double in quanto la loro rappresentazione in binario non riesce ad essere precisa e quindi presenta piccoli problemi di arrotondamento. Ad esempio, non esiste una rappresentazione precisa nel sistema decimale di 1/3 come non esiste una rappresentazione precisa di 1/10 in binario..
Vediamo un esempio:
/** * @author Alessandro Musacchio * */ public class Numeri { public static void main(String[] args) { double a = 2.0000001d; double b = 1.0000001d; System.out.print("Calcolo con i double: "); System.out.println(a - b); float af = 2.0000001f; float bf = 1.0000001f; System.out.print("Calcolo con i float: "); System.out.println(af - bf); } } |
Il risultato che danno entrambi i calcoli se eseguiti su un PC sono errati in quanto l’unico risultato ammisibile è: 1 senza alcun arrotondamento!
Vediamo ora come Java con gli ogetti BigDecimal ci permette di fare calcoli con la “massima” precisione:
import java.math.BigDecimal; /** * @author Alessandro Musacchio * */ public class Numeri { public static void main(String[] args) { BigDecimal aBD = new BigDecimal("2.0000001"); BigDecimal bBD = new BigDecimal("1.0000001"); System.out.print("Calcolo con i BigDecimal: "); System.out.println(aBD.subtract(bBD)); } } |
Eseguendo questo pezzo di codice invece vedremo il risultato esatto!