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可能会产生不同的结果.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...