这里有几个相关的问题。推理必须指定L为long,F,D为float,双重
按标题,为什么如果我们指定变量类型为长或浮动的要求,加倍?编译器不会评估变量类型吗?
的Java认为所有积分文字为int
- 这是减轻的无意记忆废物的打击?和所有浮点文字一样double
- 确保最高精度?
这里有几个相关的问题。推理必须指定L为long,F,D为float,双重
按标题,为什么如果我们指定变量类型为长或浮动的要求,加倍?编译器不会评估变量类型吗?
的Java认为所有积分文字为int
- 这是减轻的无意记忆废物的打击?和所有浮点文字一样double
- 确保最高精度?
当你有一个恒定的存在看起来相同值之间的细微差别,但都没有。另外,由于自动装箱被引入,你会得到一个非常不同的结果。
想想你会得到什么,如果你由0.1乘以0.1为float或一张双人床和转换为浮动。
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
0与使用另一种类型相比个
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
会产生不同的结果。
我相信这只是为了避免混淆。编译器如何知道1.5是否意味着浮点数或双精度浮点数,如果没有默认值可以重新使用呢?至于评估变量,请注意变量!=文字。
编辑1
对于一些意见,我认为有些时候,你不希望编译器自动翻译文本到左边的变量类型的权利。
编辑2
当然还有的
public void foo(int bar) {
//...
}
public void foo(long bar) {
//...
}
//... some other method
foo(20); // which foo is called?
当你这样做不是一个简单的任务更本就变得很重要。如果你拿
float x = 0.1 * 3.0;
它有差别如果计算机在双精度乘法,然后转换为单精度,或者如果它的第一和然后编号,以单精度转换乘法。
编辑: 不是在这个明确的情况下0.1和3.0,但如果你的数字变得足够复杂,你会遇到精度问题,显示float和double之间的差异。如果它们应该是双精度或浮点运算,则将其明确给编译器避免含糊不清。
确定你是否传递了文字而不是类型变量,即'sum(1L,2L);' - 但为什么如果我用一个类型定义变量,即'long a = 1(?L) ;长b = 2(?L);总和(A,B);'? – wulfgarpro
在一个完美的世界中,编译器是否能够根据_should_类型来判断它?当然,鉴于Java的设计,这可能是不可行的,但我认为一般来说这是不可能的。 –
我不知道他们为什么称语法为“上下文无关”,但至少它与一般原则相吻合,即表达式的含义是不言而喻的,而不依赖于其上下文。 – irreputable