这里有几个相关问题.
根据标题,为什么要指定变量类型为long或float,double?编译器不会评估变量类型吗?
解决方法
当你有一个常数时,看起来一样,但不是的值之间有微妙的差异.另外,由于引入了自动装箱功能,所以您得到的结果与此不尽相同.
考虑一下,如果将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 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可能会产生不同的结果.