我试图做一些如此简单的事情:用float / double乘以整数:
private final static int a = 100;
...
double d = 0.5; // Although this is like dividing by 2, it could be any decimal.
int x = (int) (a * d);
但是,虽然您希望这返回x = 50
,而不是x = 100
!当我使用float d = 0.5f
时会发生同样的事情。有谁知道发生了什么以及为什么这不起作用?
答案 0 :(得分:10)
JLS §4.2.4. Floating-Point Operations告诉管理浮点运算的规则,因此如果任何操作数是浮点数,那么其他操作数将被加宽到浮点(如果还没有),最终结果将是浮点数。
因此,在算术运算之前,您的int
100
将扩展为100.0
,您的操作结果将为50.0
。
现在,由于您将结果投射到int
,因此JSL §5.1.3. Narrowing Primitive Conversion将适用,并且双50.0
将缩小为int 50
。
100是不可能的结果。
我的猜测是,当你得到100分时,你会做其他事情。
答案 1 :(得分:3)
int x = (int) 0.5 * 100;
它首先将0.5转换为int ---> 0,然后相乘。