我把它放到java中,我得到了结果2.想知道为什么它不是ArithmeticException,因为不应该(t)(2 / 0.9)变成2/0。所有帮助表示赞赏。
答案 0 :(得分:2)
您的代码是
(int) (2 / 0.9)
因此,int
- 强制转换仅适用于计算2 / 0.9
之后的结果 。现在2 / 0.9
将int
除以double
值。在这种情况下,int
也将被解释为double
(在这种情况下为2.0
)。结果就像
2.0 / 0.9 = 2.22...
此过程称为数字促销(它使用扩展基元转换此处JLS§5.1.2)。来自JLS§5.6:
数字提升是一个过程,通过该过程,给定算术运算符及其参数表达式,参数将转换为推断的目标类型
T
。在促销期间选择T
,以便每个参数表达式可以转换为T
并且算术对于T
类型的值,定义了操作。
之后,强制转换到int
,这会将值四舍五入到下一个较低的整数2
。因此结果是2
。
您期望的是像
这样的表达式的结果2 / (int) 0.9
// or more explicit:
2 / ((int) 0.9)
在分割之前首先将0.9
投射到int
。在这种情况下,你会正确地得到
2 / 0
产生预期的ArithmeticException
。