【问题标题】:Java Math.pow((1/(1+1),1) not evaluating correctly [duplicate]Java Math.pow((1/(1+1),1) 评估不正确[重复]
【发布时间】:2014-05-27 00:43:37
【问题描述】:

我正在尝试使用 Java 进行一些试验,结果出现了这个问题:

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

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

是我有问题还是有真正的解释?

【问题讨论】:

  • 整数除法,你为什么要把0.5提升到第一个?只需写0.5
  • 艾略特,这是对真实事物的过度简化。

标签: java


【解决方案1】:

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

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

编辑

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

long 也会发生同样的事情。

Java Language Specification

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

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

【讨论】:

  • 这包括我解决验证码所花费的时间。
  • 哇,非常感谢。
  • 我知道你刚刚发布了,但也许你可以解释一下他的代码为什么会产生 0?对于任何新开发人员来说,为什么 Java 将 1/2 转换为整数是没有意义的。
  • @WaffleStealer654 现在开心吗?我不知道我还能说些什么。
  • 大声笑。是的。我试图鼓励人们提出“为什么”。而不是仅仅给出代码。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多