java – 推理后面必须指定L为long,F,D为float,double

前端之家收集整理的这篇文章主要介绍了java – 推理后面必须指定L为long,F,D为float,double前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这里有几个相关问题.

根据标题,为什么要指定变量类型为long或float,double?编译器不会评估变量类型吗?

Java认为所有的整数文字都是int – 这是为了减少无意的内存浪费的打击吗?所有浮点文字为双倍,以确保最高精度?

解决方法

当你有一个常数时,看起来一样,但不是的值之间有微妙的差异.另外,由于引入了自动装箱功能,所以您得到的结果与此不尽相同.

考虑一下,如果将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可能会产生不同的结果.

猜你在找的Java相关文章