这里有几个相关的问题。
按照标题,如果我们将变量类型指定为long或float,double,为什么要这样做?编译器在编译时不评估变量的类型吗?
Java将所有整数文字都视为int-这是为了减轻无意中浪费内存的打击吗?并且所有浮点文字都为double-以确保最高的精度?

最佳答案

当您拥有一个常数时,值之间会存在细微的差异,这些差异看起来相同,但事实并非相同。此外,由于引入了自动装箱,因此您得到的结果将有所不同。

考虑一下将0.1乘以0.1作为浮点数或 double 数并转换为浮点数所得到的结果。

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

现在比较使用floatint进行计算时得到的结果。
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

比较intlong
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

比较doublelong
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

总而言之,与使用其他类型相比,使用intlongdoublefloat会产生不同的结果是可能的。

10-07 20:01
查看更多