我正在尝试使用Java,这个问题出现了:
public class TestRandom {
public static void main(String[] args){
System.out.println(Math.pow((1/(1+1)),1));
}
}
评估为0.0
,这最初可能是NaN。
我有什么问题或有真正的解释吗?
答案 0 :(得分:11)
你有一个整数除法。 1/2
为0
,而不是0.5
。
您可以尝试将表达式更改为Math.pow((1.0/(1+1)),1)
以强制将其作为浮点除法。
修改强>
Java部门的设计方式与在C和C ++之前的设计方式相同。当您使用两个int
类型的表达式进行除法时,会得到类型为int
的结果。这是语言设计师做出的选择,无论好坏,我们现在都坚持使用它。但基本上它意味着分裂的任何分数结果都向下舍入(严格来说,朝向零)。在这种情况下,1/2
会四舍五入为0
。
同样的事情发生在long
。
整数除法向0舍入。也就是说,操作数n和d为二进制数字提升后的整数(第5.6.2节)产生的商是一个整数值q,其大小尽可能大,同时满足| d· q | ≤| n |。此外,当| n |时,q为正≥| d |并且n和d具有相同的符号,但是当| n |时q为负≥| d |和n和d有相反的符号。
有一种特殊情况不满足此规则:如果被除数是其类型的最大可能幅度的负整数,且除数为-1,则发生整数溢出,结果等于被除数。尽管溢出,但在这种情况下不会抛出异常。另一方面,如果整数除法中的除数值为0,则抛出ArithmeticException。