zoukankan      html  css  js  c++  java
  • java.lang.NumberFormatException: Infinite or NaN原因之浮点类型除数为0结果探究

    背景

    在对Double类型的数据进行计算操作,将结果转化为BigDecimal时抛出了下面的异常,进行了Debug才发现了问题原因,同时也暴露出了自己在一些基础知识上还有些欠缺。

    Exception in thread "main" java.lang.NumberFormatException: Infinite or NaN
    	at java.math.BigDecimal.<init>(BigDecimal.java:895)
    	at java.math.BigDecimal.<init>(BigDecimal.java:872)
    	at com.lingyejun.authenticator.DoubleTest.main(DoubleTest.java:13)

    概念补充

    在java中进行数字类型运算的时,之前一直有一种错误的观念,即进行除法运算时当除数为0时在运行时会抛出java.lang.ArithmeticException: / by zero运行时异常。如此想当然的以为对于浮点类型如Float和Double也是如此,下面一段代码便可以说明问题。

    package com.lingyejun.authenticator;
    
    public class DoubleTest {
    
        public static void main(String[] args) {
            Double d1 = 10 / 0D;
            Double d2 = -10 / 0D;
            Double d3 = 0.0 / 0D;
            System.out.println("d1=" + d1 + " d2=" + d2 + " d3=" + d3);
        }
    }
    

    运算结果为“d1=Infinity d2=-Infinity d3=NaN”,什么?数字运算居然还能算出来了字符串???打印出来的Infinity、-Infinit、NaN其实不是字符串,而是double类型的常量,查看源码注释便懂了。

    /**
     * A constant holding the positive infinity of type
     * {@code double}. It is equal to the value returned by
     * {@code Double.longBitsToDouble(0x7ff0000000000000L)}.
     */
    public static final double POSITIVE_INFINITY = 1.0 / 0.0;
    
    /**
     * A constant holding the negative infinity of type
     * {@code double}. It is equal to the value returned by
     * {@code Double.longBitsToDouble(0xfff0000000000000L)}.
     */
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
    
    /**
     * A constant holding a Not-a-Number (NaN) value of type
     * {@code double}. It is equivalent to the value returned by
     * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
     */
    public static final double NaN = 0.0d / 0.0;
    

    正无穷:POSITIVE_INFINITY,正数除以零得到正无穷。

    负无穷:NEGATIVE_INFINITY,负数除以零得到负无穷。

    非数字:NaN,0除以0时得到非数字。 

    异常原因  

    通过查看BigDecimal类中针对Double类型数据的构造方法,我们知道了,在构造BigDecimal对象时,构造方法中传入的Double类型为无穷大或非数字时会抛出NumberFormatException异常。

    public BigDecimal(double val, MathContext mc) {
            if (Double.isInfinite(val) || Double.isNaN(val))
                throw new NumberFormatException("Infinite or NaN");
    拨云见日探究清楚之后,一切都是那样的理所应当。
  • 相关阅读:
    最新iOS发布App Store详细图文教程~
    介绍一个轻量级iOS安全框架:SSKeyChain
    今天科普一下 苹果开发者账号中:个人、公司、企业账号的区别
    iOS开发:Framework的创建
    JMS 在 SpringBoot 中的使用
    iOS 引入外部字体 otf/ttf/ttc
    公司企业苹果开发者账号中个人、公司企业账号的不同
    Git版本管理
    有关苹果手机下载应用后提示不受信任的企业开发者解决方案:
    尝试一下markdown
  • 原文地址:https://www.cnblogs.com/lingyejun/p/11216033.html
Copyright © 2011-2022 走看看