• 震惊!System.out.println(1.0/0)竟然会正常输出


    先让我们来试一试

    package erdan.demo;
    public class TestDouble {   
     public static void main(String[] args) {   
          System.out.println(1.0 / 0);   
     }
    }
    

    你认为的我认为的它应该会抛出  ArithmeticException 异常

    但是它现在输出了 Infinity

    为什么呢?

    Double 数据类型支持无穷大

    还有其他类型支持吗?

    有,还有 Float

    下面我们来查看 Double 源码,可以看到

    /** 
      * 一个常数,保持类型的正无穷大 
     */
    public static final double POSITIVE_INFINITY = 1.0 / 0.0;
    /**
     * 一个常数,保持类型的负无穷大 
    */
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
    /** 
      * 一个常数,非数值类型 
    */
    public static final double NaN = 0.0d / 0.0;
    

    下面来试验下 0.0/0 与 -1.0/0

    Double 正无穷 = 1.0 / 0;
    Double 负无穷 = -1.0 / 0;
    System.out.println("正无穷:" + 正无穷);
    System.out.println("负无穷:" + 负无穷);
    Double 非数值 = 0.0 / 0;
    System.out.println("非数值 0.0/0 ->" + 非数值);
    

    输出:

    正无穷:Infinity
    负无穷:-Infinity
    非数值 0.0/0 ->NaN
    

    对无穷大进行运算

    下面来测试对 Float 类型与 Doubloe 类型无穷大进行运算

    public static void testFloatInfinity() {
         Float infFloat = Float.POSITIVE_INFINITY;     
         Double infDouble = Double.POSITIVE_INFINITY;     
         System.out.println("infFloat + 5 = " + (infFloat + 5));     
         System.out.println("infFloat - infDouble = " + (infFloat - infDouble));     
         System.out.println("infFloat * -1 = " + (infFloat * -1));
    }
    

    输出:

    infFloat + 5 = InfinityinfFloat - infDouble = NaNinfFloat * -1 = -Infinity
    

    可以注意到 1,3 行运算符合我们的预计结果

    ps: Infinity- Infinity 的结果不是数字类型

    对这些值进行判断

    public static void checkFloatInfinity() {   
     Double 正无穷 = 1.0 / 0;    
     Double 负无穷 = -1.0 / 0;    
     Double 非数值 = 0.0 / 0;    
     System.out.println("判断正无穷: " + Double.isInfinite(正无穷));    
     System.out.println("判断负无穷: " + (Double.NEGATIVE_INFINITY == 负无穷));    
     System.out.println("判断非数值(==): " + (Double.NaN == 非数值));    
     System.out.println("判断非数值(isNaN):  " + Double.isNaN(非数值));
    }
    

    输出:

    判断正无穷: true
    判断负无穷: true
    判断非数值(==): false
    判断非数值(isNaN):  true
    

    ps: 判断 NaN 不要使用 ==

    公众号

  • 相关阅读:
    ASP.NET 4.0 与 Entity Framework 4第四篇Entity Framework在三层架构中的使用
    ASP.NET 4.0 与 Entity Framework 4第一篇采用ModelFirst 开发方式创建数据库
    ASP.NET 4.0 与 Entity Framework 4第二篇使用Entity Framework 进行CRUD操作
    ASP.NET 4.0 与 Entity Framework 4第三篇使用Entity Framework调用存储过程
    Unity3D4.* NGUI制作动态字库
    Unity3D内存释放
    1112 Stucked Keyboard (20 分)(map)【回顾】
    1116 Come on! Let's C (20 分)(hash散列)
    1108 Finding Average (20 分)(字符串处理)
    1113 Integer Set Partition (25 分)(排序)
  • 原文地址:https://www.cnblogs.com/cvandy/p/12952713.html
Copyright © 2020-2023  润新知