2011-09-23 80 views
9

这里有几个相关的问题。推理必须指定L为long,F,D为float,双重

按标题,为什么如果我们指定变量类型为长或浮动的要求,加倍?编译器不会评估变量类型吗?

的Java认为所有积分文字为int - 这是减轻的无意记忆废物的打击?和所有浮点文字一样double - 确保最高精度?

回答

16

当你有一个恒定的存在看起来相同值之间的细微差别,但都没有。另外,由于自动装箱被引入,你会得到一个非常不同的结果。

想想你会得到什么,如果你由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 

现在比较你会得到什么,如果您使用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)); 

打印

a= 22222220 
b= 22222222 
a == b is false 

比较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)); 

打印

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 

总之其可能构造的情况下使用intlongdoublefloat会产生不同的结果。

1

我相信这只是为了避免混淆。编译器如何知道1.5是否意味着浮点数或双精度浮点数,如果没有默认值可以重新使用呢?至于评估变量,请注意变量!=文字。

编辑1
对于一些意见,我认为有些时候,你不希望编译器自动翻译文本到左边的变量类型的权利。

编辑2
当然还有的

public void foo(int bar) { 
    //... 
} 

public void foo(long bar) { 
    //... 
} 

    //... some other method 
    foo(20); // which foo is called? 
+1

确定你是否传递了文字而不是类型变量,即'sum(1L,2L);' - 但为什么如果我用一个类型定义变量,即'long a = 1(?L) ;长b = 2(?L);总和(A,B);'? – wulfgarpro

+0

在一个完美的世界中,编译器是否能够根据_should_类型来判断它?当然,鉴于Java的设计,这可能是不可行的,但我认为一般来说这是不可能的。 –

+0

我不知道他们为什么称语法为“上下文无关”,但至少它与一般原则相吻合,即表达式的含义是不言而喻的,而不依赖于其上下文。 – irreputable

8

当你这样做不是一个简单的任务更本就变得很重要。如果你拿

float x = 0.1 * 3.0;

它有差别如果计算机在双精度乘法,然后转换为单精度,或者如果它的第一和然后编号,以单精度转换乘法。

编辑: 不是在这个明确的情况下0.1和3.0,但如果你的数字变得足够复杂,你会遇到精度问题,显示float和double之间的差异。如果它们应该是双精度或浮点运算,则将其明确给编译器避免含糊不清。

相关问题