Quando si dispone di una costante ci sono sottili differenze tra il valore che sembrano uguali, ma non lo sono. Inoltre, poiché è stata introdotta la funzione di autoboxing, si ottiene un risultato molto diverso quanto meno.
Considera cosa ottieni se si moltiplica 0.1 per 0.1 come float o come double e si converte in float.
float a = (float) (0.1 * 0.1);
float b = 0.1f * 0.1f;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
stampe
a= 0.00999999977648258209228515625
b= 0.010000000707805156707763671875
a == b is false
Ora confrontare ciò che si ottiene se si utilizza uno o float
int
per eseguire un calcolo.
float a = 33333333f - 11111111f;
float b = 33333333 - 11111111;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
stampe
a= 22222220
b= 22222222
a == b is false
Confronta int
e long
long a = 33333333 * 11111111; // overflows
long b = 33333333L * 11111111L;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
stampe
a= -1846840301
b= 370370362962963
a == b is false
confrontare double
con long
double a = 333333333333333333L/333333333L;
double b = 333333333333333333D/333333333D;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
stampe
a= 1000000001
b= 1000000000.99999988079071044921875
a == b is false
In sintesi sua possibile costruire una situazione in cui utilizzando int
, long
, double
o float
produrrà un risultato diverso rispetto all'utilizzo altro tipo.
fonte
2011-09-23 07:45:22
sicuro se si passa il letterale a differenza di una variabile tipizzata, ad esempio 'sum (1L, 2L);' - ma perché se sto definendo la variabile con un tipo, ad esempio 'long a = 1 (? L) ; long b = 2 (? L); sum (a, b); '? – wulfgarpro
In un mondo perfetto, il compilatore non sarebbe in grado di capirlo in base al tipo _should_ essere? Naturalmente, questo potrebbe non essere fattibile dato il design di Java, ma non penso che sia impossibile in generale. –
Non so perché chiamano la grammatica "context free", ma almeno coincide con il principio generale che il significato di un'espressione è evidente, non dipendente dal suo contesto. – irreputable