【问题标题】:How to display NaN in Java?如何在 Java 中显示 NaN?
【发布时间】:2015-03-06 18:24:23
【问题描述】:

在 Java 中,我除以零,这显然不会产生数字。

public class tempmain {
    public static void main(String args[])
    {
        float a=3/0;
        System.out.println(a);
    }
}

我希望输出为“NaN”,但它显示以下错误:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at tempmain.main(tempmain.java:6)

有什么方法可以显示NaN(if(denominator==0)除外)?

【问题讨论】:

标签: java math nan arithmetic-expressions


【解决方案1】:

怎么样:

public class tempmain {

public static void main(String args[])
{
    try {
       float a=3/0;
       System.out.println(a);
    } catch (ArithmeticException x) {
       System.out.println("Not Evaluable");
    }
}

}

还有这个选项:

{
...
//if (a != a) {        // these two are equivalent
if (Float.isNaN(a)) {
  System.out.println("NaN");
  }
}

见:Float.NaN == Float.NaN

【讨论】:

  • 你可以做那个比较,但是效率很低。最好使用Float.isNaN()Double.isNaN()
  • @Ascalonian 为什么这应该是低效的?这是 isNaN 的代码:public static boolean isNaN(float f) { return f != f; }
  • @Absurd-Mind 很好的发现。之前有人告诉我不要使用它。我想我应该检查一下自己以确认。感谢您解决这个问题!
  • @Ascalonian,我也是,谢谢 :-)
  • 之所以应该使用isNaN()而不是a != a,是因为前者是明确的,不知道NaN != NaN概念的人也可以理解。
【解决方案2】:

首先,浮点数除以零不会给出 NaN,它会给出无穷大。其次,你是在除以整数,而不是浮点数。

float a = 3.0f/0.0f;
System.out.println(a);  // Prints Infinity

【讨论】:

    【解决方案3】:

    由于处理数字文字 3 和 0 的方式,您会收到意外的 ArithmeticException。它们被解释为整数,尽管您将 a 分配为浮点数。 Java 会将3 解释为整数,3f 解释为浮点数,3.03d 解释为双精度数。除法以整数除法执行,结果转换为浮点数。要查看另一个有趣的其他效果 - 尝试 float a = 1/3 并检查 a - 你会发现它是 0.0,而不是 0.3333.... 正如你所期望的那样。

    摆脱异常 - 改变

    float a = 3/0;
    

    float a = 3f/0;
    

    正如其他人在 cmets 和答案中指出的那样,如果您随后打印 a,您将看到 Infinity 而不是 NaN。如果你真的想在这种情况下打印 NaN,你可以测试 a 是否是无限的,即

    if (Float.isInfinite(a)) {
         System.out.println("I want to print Infinity as NaN");
    }
    

    但我建议不要这样做,因为它具有高度误导性 - 但我怀疑这不是你的意思

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 2012-01-09
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2020-08-23
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多