Когда у вас есть константа, есть тонкие различия между значениями, которые выглядят одинаково, но это не так.Кроме того, с тех пор, как был введен автобокс, вы получите совсем другой результат:
Рассмотрите, что вы получите, если умножить 0,1 на 0,1 как число с плавающей запятой или удвоить и преобразовать в число с плавающей запятой.
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));
печатает
a= 0.00999999977648258209228515625
b= 0.010000000707805156707763671875
a == b is false
Теперь сравните то, что вы получите, если вы используете float
или int
для выполнения расчетов.
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));
отпечатки
a= 22222220
b= 22222222
a == b is false
Сравнить int
и 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));
отпечатков
a= -1846840301
b= 370370362962963
a == b is false
сравнить double
с 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));
отпечатков
a= 1000000001
b= 1000000000.99999988079071044921875
a == b is false
В итоге можно построить ситуацию, когда использование int
, long
, double
или float
даст другой результат по сравнению с использованием другого типа.