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

wul*_*pro 9 java variables primitive-types

这里有一些相关的问题.

根据标题,如果我们将变量类型指定为long或float,double,为什么需要它?编译器是否在编译时评估变量类型?

Java认为所有积分文字都是int- 这是为了减少无意中内存浪费的打击?并且所有浮点文字都是double- 以确保最高精度?

Pet*_*rey 16

当你有一个常量时,值之间存在微妙的差异,看起来相同但不是.此外,由于引入了自动装箱,因此您可以获得非常不同的结果.

考虑一下如果将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));
Run Code Online (Sandbox Code Playgroud)

版画

a= 0.00999999977648258209228515625
b= 0.010000000707805156707763671875
a == b is false
Run Code Online (Sandbox Code Playgroud)

现在比较您使用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));
Run Code Online (Sandbox Code Playgroud)

版画

a= 22222220
b= 22222222
a == b is false
Run Code Online (Sandbox Code Playgroud)

比较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));
Run Code Online (Sandbox Code Playgroud)

版画

a= -1846840301
b= 370370362962963
a == b is false
Run Code Online (Sandbox Code Playgroud)

比较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));
Run Code Online (Sandbox Code Playgroud)

版画

a= 1000000001
b= 1000000000.99999988079071044921875
a == b is false
Run Code Online (Sandbox Code Playgroud)

总之其可能构造的情况下使用int,long,doublefloat与使用另一种类型相比,将产生不同的结果.


Ste*_*ner 8

当您执行的不仅仅是简单的任务时,这一点变得很重要 如果你采取

float x = 0.1*3.0;

如果计算机以双精度进行乘法,然后转换为单精度,或者如果它首先将数字转换为单精度然后相乘,则会有所不同.

编辑:不是在这个明确的情况下0.1和3.0,但如果你的数字变得足够复杂,你将遇到精度问题,显示浮点数和双精度之间的差异.如果它们应该是双精度或浮点数,则使它对编译器显而易见避免歧义.