在Java中使用short,int,long,double,float进行转换
据我所知,当您使用Java中的算术运算在两个这些类型之间进行转换时,例如double + int,结果将是更大的类型(在本示例中,结果将是double)。 在对相同大小的2种类型进行算术运算时会发生什么? int + float和long + double会给出什么? 因为int和float每个都是4个字节,而long和double是8个字节。
这全部由JLS中的二进制数字促销规则指定。 来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 :
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用,顺序如下:
如果任何操作数是引用类型,则进行拆箱转换(第5.1.8节)。
应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则另一个操作数转换为float。
否则,如果任一操作数的类型为long,则另一个操作数转换为long。
否则,两个操作数都将转换为int类型。
在类型转换之后,如果有的话,将值集转换(第5.1.13节)应用于每个操作数。
对某些运算符的操作数执行二进制数字提升:
乘法运算符*,/和%(§15.17)
数值类型的加法和减法运算符+和 – (§15.18.2)
数值比较运算符<,<=,>和> =(§15.20.1)
数字相等运算符==和!=(§15.21.1)
整数按位运算符&,^和| (§15.22.1)
在某些情况下,条件运算符? :(§15.25)
(“值集转换”是关于浮点表示之间的映射。)
int
+ float
将为您提供float
(请注意,您必须将结果转换为float
因为默认情况下使用double
)。 long
+ double
会给你double
。
仍将返回可以保持完全价值的"bigger"
类型。 在你的具体问题
如果你在int和float之间做一个+,那么return将是一个float而long + double返回一个double,
加法运算符+
和-
的行为在15.18.2中定义。 JLS的数值类型的加法运算符(+和 – ) 。 它声明它首先执行二进制数字促销:
对操作数执行二进制数字提升。
这反过来由5.6.2定义。 二进制数字促销 。 实质上,对于原始人:
- 如果任一操作数的类型为double,则另一个操作数转换为double。
- 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
- 否则,如果任一操作数的类型为long,则另一个操作数转换为long。
- 否则,两个操作数都将转换为int类型。
关于类型转换有两个有趣的FAQ,可以在以下url找到: http : //www.programmersheaven.com/2/FAQ-JAVA-Type-Conversion-Casting
http://myhowto.org/java/60-understanding-the-primitive-numeric-type-conversions-in-java/
在两种相同尺寸的类型上回答您的问题,返回值是具有最大精度的类型。
请尝试以下代码:
public static void main(String[] args) { int i=1; float f=2.5f; long l=10; double d=3.74; System.out.println(i+f); System.out.println(f+i); System.out.println(l+d); System.out.println(d+l); }
你会看到结果是3.5和13.74,分别是浮点数和双精度数(在Netbeans 6.9和java 1.6中测试)。
这个“促销”的一个问题是, long
+ float
将“扩大”到使用浮动。
例如
System.out.println(1111111111111111111L + 0.0f); System.out.println(1111111111111111111L + 0.0);
版画
1.11111113E18 1.11111111111111117E18
处理long和float时,你可能得不到更广泛的类型,并且可能失去比你预期的更高的精度。