Java Math.pow((1/(1+;1),1)计算不正确

Java Math.pow((1/(1+;1),1)计算不正确,java,Java,我试着用Java做了一点实验,出现了这个问题: public class TestRandom { public static void main(String[] args){ System.out.println(Math.pow((1/(1+1)),1)); } } 评估为0.0,最有可能是NaN 我有什么问题吗?或者有什么真正的解释吗?你有一个整数除法。1/2是0,而不是0.5 您可以尝试将表达式更改为Math.pow((1.0/(1+1)),1)以强制

我试着用Java做了一点实验,出现了这个问题:

public class TestRandom {
    public static void main(String[] args){
        System.out.println(Math.pow((1/(1+1)),1));
    }
}
评估为
0.0
,最有可能是NaN


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

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

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

编辑

爪哇的划分是用C和C++的方式设计的,它是在java之前的。当你用两个表达式“类型<代码> int <代码>进行划分时,你得到了一个类型<代码> int <代码>的结果。这是语言设计者做出的选择,不管是好是坏,我们现在都坚持了。但是基本上说,这意味着任何一个。除法的分数结果向下四舍五入(严格地说,接近零)。在这种情况下,

1/2
四舍五入到
0

同样的事情也发生在
long

警察说

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

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


这包括我解验证码所花的时间。哦,哇,非常感谢。我知道你刚刚发布了,但是,你可以解释为什么他的代码会产生0?对于任何新开发人员来说,Java为什么会将1/2转换为整数是毫无意义的。@WaffleStealer654高兴了吗?我不知道我还能说些什么。哈哈,是的。我试图鼓励人们把1/2转换为整数在“为什么”。而不是仅仅给出code.Integer除法,你为什么要把
0.5
提高到第一个呢?只要写
0.5
。埃利奥特,这是对真实事物的一个大大的过分简化。