Java中的short、int、long、double和float之间的转换
据我所知,当您使用Java中的算术运算在这两种类型之间进行转换时,例如double+int,结果将是更大的类型(在本例中,这意味着结果将是double)。对两种大小相同的类型进行算术运算时会发生什么情况?int+float和long+double将给出什么?因为int和float分别是4个字节,long和double是8个字节Java中的short、int、long、double和float之间的转换,java,types,casting,int,double,Java,Types,Casting,Int,Double,据我所知,当您使用Java中的算术运算在这两种类型之间进行转换时,例如double+int,结果将是更大的类型(在本例中,这意味着结果将是double)。对两种大小相同的类型进行算术运算时会发生什么情况?int+float和long+double将给出什么?因为int和float分别是4个字节,long和double是8个字节 int+float将为您提供float(请注意,您必须将结果强制转换为float,因为默认情况下使用了double)long+double将为您提供double这都是由J
int
+float
将为您提供float
(请注意,您必须将结果强制转换为float
,因为默认情况下使用了double
)long
+double
将为您提供double
这都是由JLS中的二进制数字升级规则指定的。发件人:
当运算符将二进制数字提升应用于一对
操作数,每个操作数必须表示可转换为
数字类型,按顺序应用以下规则:
- 如果其中一个操作数的类型为double,则另一个操作数将转换为double
- 否则,如果其中一个操作数为float类型,则转换另一个操作数 漂浮
- 否则,如果其中一个操作数的类型为long,则转换另一个操作数 太久了
- 否则,两个操作数都将转换为int类型
- 乘法运算符*、/和%(§15.17)
- 数字类型的加减运算符+和- (§15.18.2)
- 数值比较运算符=(§15.20.1)
- 数值相等运算符==和!=(§15.21.1)
- 整数位运算符&、^和|(§15.22.1)
- 在某些情况下,条件运算符?:(§15.25)
(“值集转换”是关于浮点表示之间的映射。)仍将返回可以保存整个值的
“biger”
类型。在你的具体问题中
如果在int和float之间加上+,则返回值将是float
long+double返回一个double,加法运算符
+
和-
的行为在JLS的中定义。它声明它首先执行二进制数字升级:
对操作数执行二进制数字提升
这依次由定义。实质上,对于原语:
- 如果其中一个操作数的类型为double,则另一个操作数将转换为double
- 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
- 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long
- 否则,两个操作数都将转换为int类型
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
将“扩展”到使用浮点
e、 g
印刷品
1.11111113E18
1.11111111111111117E18
在处理long和float时,您可能无法获得比预期更宽的类型,并且可能会损失更高的精度。IMHO,Java应该禁止与许多运算符进行类型组合,允许在大多数情况下从
double
隐式转换为float
,其中目标类型显然是float
,由于这种转换几乎总是会产生预期的行为,并且不允许从float
到double
的隐式转换,因为这种转换通常是错误的(例如double OneTenth=1.0f/10.0f;
应该对IMHO发出尖叫,但不会)。如果生成的float
不能直接与其他类型交互,我不介意从long
隐式转换为float
。@supercat我同意,但另一种方法是double
更精确,这就是为什么从float转换为double是可以的。(您可以无损失地转换回)如果将double转换为float并再次转换回,则可能会丢失精度,这就是为什么它不安全的原因。一般来说,我会避免使用float,因为它在99%的情况下都没有用处;我刚刚在上写了一篇博客,希望得到你的反馈。对我来说,最重要的一点是,如果t
是某个抽象量x的类型t
的最佳表示,并且存在从t
到U
的隐式转换,那么(U)t
应该是该x的最佳表示之一。另一个是,对于类型和值的任何组合,(U)t==t
不应返回false。要么…@我同意(双精度)0.1f==0.1f
为真(float)0.1==0.1
为false。您想在我的博客或聊天中讨论此问题吗?我想听听你对我在那里写的东西的反馈。至于您的场景,如果我正在编写规则,并且不能使长a=b*c代码>相当于长a=(长)b*c
我会让语言需要一个typecast到int
(例如long a=(int)(b*c);
,例如通过一个属性禁止其
1.11111113E18
1.11111111111111117E18