Java Math.pow((1 /(1 + 1),1)未正确评估

时间:2014-05-27 00:43:37

标签: java

我正在尝试使用Java,这个问题出现了:

public class TestRandom {
    public static void main(String[] args){
        System.out.println(Math.pow((1/(1+1)),1));
    }
}

评估为0.0,这最初可能是NaN。

我有什么问题或有真正的解释吗?

1 个答案:

答案 0 :(得分:11)

你有一个整数除法。 1/20,而不是0.5

您可以尝试将表达式更改为Math.pow((1.0/(1+1)),1)以强制将其作为浮点除法。

修改

Java部门的设计方式与在C和C ++之前的设计方式相同。当您使用两个int类型的表达式进行除法时,会得到类型为int的结果。这是语言设计师做出的选择,无论好坏,我们现在都坚持使用它。但基本上它意味着分裂的任何分数结果都向下舍入(严格来说,朝向零)。在这种情况下,1/2会四舍五入为0

同样的事情发生在long

Java Language Specification

  

整数除法向0舍入。也就是说,操作数n和d为二进制数字提升后的整数(第5.6.2节)产生的商是一个整数值q,其大小尽可能大,同时满足| d· q | ≤| n |。此外,当| n |时,q为正≥| d |并且n和d具有相同的符号,但是当| n |时q为负≥| d |和n和d有相反的符号。

     

有一种特殊情况不满足此规则:如果被除数是其类型的最大可能幅度的负整数,且除数为-1,则发生整数溢出,结果等于被除数。尽管溢出,但在这种情况下不会抛出异常。另一方面,如果整数除法中的除数值为0,则抛出ArithmeticException。