Tipi di numeri
§ int: numeri
interi, no parti frazionarie
1, -4, 0
§ double: numeri
in virgola mobile
0.5, -3.11111, 4.3E24, 1E-14
Tipi numerici
§ Un calcolo numerico trabocca se il risultato esce
dall’intervallo del tipo numerico.
int n = 1000000;
System.out.println(n * n); // visualizza -727379968
§ Java ha otto tipi primitivi, fra i quali quattro tipi
interi
e due tipi in virgola mobile.
Tipi primitivi
Tipi numerici: virgola mobile
§ Avvengono errori di arrotondamento quando non si può
fare una conversione numerica esatta.
double f = 4.35;
System.out.println(100
* f); // visualizza 434.99999999999994
§ In Java non si può assegnare un valore in virgola mobile
a una variabile intera:
double
balance = 13.75;
int dollars = balance; // Errore
Tipi numerici: virgola mobile
§ Cast (forzatura): converte in numero intero il valore in
virgola mobile
int dollars = (int)
balance;
Il cast (int) ignora la parte frazionaria.
§ Il metodo Math.round
arrotonda un numero in virgola
mobile all'intero più vicino
long rounded = Math.round(balance));
Se balance vale 13.75, allora a rounded viene
assegnato il valore 14.
Sintassi 4.1: Cast
(nomeTipo) espressione
Esempio:
(int) (balance * 100)
Obiettivo:
Convertire un’espressione in un tipo di dati diverso.
Numeri grandi e precisione final
§ classi BigInteger (numeri interi grandi) e BigDecimal
(numeri frazionari grandi) in java.math
– Pro: Altissima “capienza” e
precisione
– Contro: Lentezza. Bisogna usare
metodi per eseguire
operazioni (add, subtract e multiply)
BigInteger
n = new BigInteger(“1000000”);
BigInteger
r = n.multiply(n);
System.out.println(r); //
Visualizza 1000000000000
BigDecimal
d = new BigDecimal(“4.35”);
BigDecimal
e = new BigDecimal(“100”);
BigDecimal f =
d.multiply(e);
System.out.println(f); //
Visualizza 435.00
Costanti final
§ Una variabile final è una costante
§ dopo che le è stato assegnato un valore, non può più
essere
modificato.
§ Dare un nome alle costanti rende i programmi più facili da
leggere e da modificare.
– Non usare numeri “magici”! Introdurre
una costante
§ Convenzione: per le costanti utilizzare nomi con tutte le
lettere
maiuscole.
final
double QUARTER_VALUE = 0.25;
final
double DIME_VALUE = 0.1;
final
double NICKEL_VALUE = 0.05;
final
double PENNY_VALUE = 0.01;
payment
= dollars + quarters * QUARTER_VALUE + dimes * DIME_VALUE
+
nickels * NICKEL_VALUE + pennies * PENNY_VALUE;
Costanti static
final
§ Spesso le costanti vengono usate in più metodi, per cui è
necessario dichiararle insieme ai campi di esemplare della
classe, identificandole come static, oltre che final.
§ Metodi di altre classi possono accedere a una costante
pubblica indicando il nome della classe in cui essa è
definita, seguito da un punto e dal nome della costante
stessa. Esempio Math.PI.
La classe Math della libreria standard definisce un paio di utili
costanti:
public
class Math
{
. .
.
public
static final double E = 2.7182818284590452354;
public
static final double PI = 3.14159265358979323846;
}
Sintassi 4.2: Definizione di costante
Come variabile locale di un metodo o come attributo di un
oggetto:
final nomeTipo
nomeVariabile = espressione;
In una classe:
specificatoreDiAccesso
static final nomeTipo
nomeVariabile
= espressione;
Esempio:
final
double NICKEL_VALUE = 0.05;
public
static final double LITERS_PER_GALLON = 3.785;
Obiettivo:
Definire una costante come variabile locale di un
metodo,
o come attributo di un oggetto, o come variabile di
classe.
File CashRegister.java
01: /**
02: Un registratore di cassa somma gli articoli venduti
e
calcola il resto dovuto al cliente.
03: */
04: public class CashRegister
05: {
06: /**
07: Costruisce un registratore di cassa senza soldi
nel cassetto.
08: */
09: public
CashRegister()
10: {
11: purchase = 0;
12: payment = 0;
13: }
14:
15: /**
16: Registra la vendita di un articolo.
17: @param amount il prezzo dell'articolo
18: */
19: public void
recordPurchase(double amount)
20: {
21: purchase = purchase + amount;
22: }
23:
24: /**
25: Registra la quantità di denaro ricevuta per il pagamento.
26: @param dollars il numero di dollari pagati
27: @param quarters il numero di quarti di dollaro pagati
28: @param dimes il numero di decimi di dollaro pagati
29: @param nickels il numero di nickel di dollaro pagati
30: @param pennies il numero di penny di dollaro pagati
31: */
32: public void
enterPayment(int dollars, int quarters,
33: int dimes, int
nickels, int pennies)
34: {
35: payment = dollars
+ quarters * QUARTER_VALUE
+ dimes * DIME_VALUE
36: + nickels *
NICKEL_VALUE + pennies
* PENNY_VALUE;
37: }
38:
39: /**
40: Calcola il resto dovuto al cliente e azzera
la
macchina per la vendita successiva.
41: @return il resto dovuto al cliente
42: */
43: public double
giveChange()
44: {
45: double change =
payment - purchase;
46: purchase = 0;
47: payment = 0;
48: return change;
49: }
50:
51: public static
final double QUARTER_VALUE = 0.25;
52: public static
final double DIME_VALUE = 0.1;
53: public static
final double NICKEL_VALUE = 0.05;
54: public static
final double PENNY_VALUE = 0.01;
55: // campi di esemplare
56: private double purchase;
57: private double payment;
58: }
File CashRegisterTester.java
01: /**
02: Classe che collauda la classe CashRegister.
03: */
04: public class
CashRegisterTester
05: {
06: public static void
main(String[] args)
07: {
08: CashRegister
register = new CashRegister();
09:
10: register.recordPurchase(0.75);
11: register.recordPurchase(1.50);
12: register.enterPayment(2,
0, 5, 0, 0);
13: System.out.print("Change=");
14: System.out.println(register.giveChange());
15:
16: register.recordPurchase(2.25);
17: register.recordPurchase(19.25);
18: register.enterPayment(23,
2, 0, 0, 0);
19: System.out.print("Change=");
20: System.out.println(register.giveChange());
21: }
22: }
Visualizza
Change=0.25
Change=2.0
Assegnazione, incremento e decremento
§ L'operatore = è detto operatore di assegnazione
§ alla sua sinistra ci deve essere il nome di una variabile,
mentre alla
destra ci può essere un singolo valore o un’espressione
§ imposta la variabile al valore dato s = items + 1;m
§ L’assegnazione di un valore a una variabile non è
un’uguaglianza matematica.
§ Gli operatori ++ e – – incrementano e decrementano una
variabile di un’unità.
§ items++ ha
lo stesso effetto di items = items + 1
§ items-- sottrae
1 a items
Assegnazione, incremento e decremento
Incrementare
una variabile
Operazioni aritmetiche
§ / è l'operatore
per la divisione
§ Se entrambi gli argomenti dell’operatore / sono di tipo
intero, il risultato è un numero intero e il resto viene
ignorato.
§ 7.0 / 4 restituisce
1.75
7 / 4 restituisce 1
§ L’operatore % calcola il resto di una divisione.
§ 7 % 4 è 3
Divisione tra interi
§ Errore comune
int s1 = 5; // punteggio
della prova 1
int s2 = 6; // punteggio
della prova 2
int s3 = 3; // punteggio
della prova 3
double
averageErr = (s1 + s2 + s3) / 3; // Errore
double
averageOk1 = (s1 + s2 + s3) / 3.0; // OK
double
sum = s1 + s2 + s3;
double averageOk2 = sum /
3; // OK
La classe Math
§ La classe Math
contiene i metodi sqrt e pow per
calcolare radici quadrate e potenze.
§ Per calcolare xn, si usa il metodo Math.pow(x, n)
§ tuttavia, per calcolare x2 è molto più efficiente scrivere
semplicemente x
* x
§ Per estrarre la radice quadrata di un numero, si usa il
metodo Math.sqrt scrivendo Math.sqrt(x)
§ In Java,
diventa
(-b
+ Math.sqrt(b * b - 4 * a * c)) / (2 * a)
Metodi matematici in Java