首页 > 代码库 > atof(将字符串转化为浮点数的Java实现)

atof(将字符串转化为浮点数的Java实现)

原文链接:http://www.loveyqq.tk/blog/2014/07/03/atof-jiang-zi-fu-chuan-zhuan-hua-wei-fu-dian-shu-de-javashi-xian/


atof,是C语言中的一个字符串转化为浮点数的函数,在Java在也有一个对应的实现,就是大家所熟悉的Double.parseDouble(String s)函数。


既然是讲atof的Java实现,肯定脱离不开C语言的实现,引用[我的算法学习之路]中的一句话


stof是一个简单到爆的“算法”


事实却是如此,字符串转化为浮点数整个的算法核心只有一个,如何将字符‘0‘~‘9‘转化为计算机能识别的数字0~9,而在C语言中有一个很简单的转化方式:int x = (char)c - ‘0‘; 剩下的就是一些异常处理以及如果有效的得到该字符串的位数。


本文核心是想理解Java的实现,借此可以了解Java将字符串转为为浮点数的原理,通过这些代码可以看到,代码编写人注意了每一行代码的变量声明,以及if的逻辑控制提高效率:


<span style="font-size:18px;">public strictfp double doubleValue(){
        int     kDigits = Math.min( nDigits, maxDecimalDigits+1 );
        long    lValue;
        double  dValue;
        double  rValue, tValue;

        // First, check for NaN and Infinity values
        if(digits == infinity || digits == notANumber) {
            if(digits == notANumber)
                return Double.NaN;
            else
                return (isNegative?Double.NEGATIVE_INFINITY:Double.POSITIVE_INFINITY);
        }
        else {
            if (mustSetRoundDir) {
                roundDir = 0;
            }
            /*
             * convert the lead kDigits to a long integer.
             */
            // (special performance hack: start to do it using int)
            int iValue = http://www.mamicode.com/(int)digits[0]-(int)'0';>
上面就是整个实现的源代码,之所以列出来,省的各位去找了,下面就来一行行解读:


首先跟C语言中的实现一样,去掉了字符串前后的空格:


<span style="font-size:18px;"> in = in.trim()</span>

判断是否为空的字符串:


<span style="font-size:18px;"> int l = in.length();
 if (l == 0) throw new NumberFormatException("empty String");</span>

取出第一个字符,判断是否为正负数:


<span style="font-size:18px;"> int i = 0;
            switch (c = in.charAt(i)) {
                case '-':
                    isNegative = true;
                    //FALLTHROUGH
                case '+':
                    i++;
                    signSeen = true;
            }</span>

检查是否为Infinity(无穷大)或者NaN(不明确的数值结果,一般被除数为0会出现这个结果)


<span style="font-size:18px;">  c = in.charAt(i);

    if (c == 'N' || c == 'I');</span>

如果既不是Infinity或者NaN,则检查是为十六进制浮点数


<span style="font-size:18px;"> else if (c == '0');</span>

之后就是把字符串中的每个字符拆解出来放到array中,


Java提供了一个方法,将字符array转化为数字,即doubleValue(),


从doubleValue()中可以看到


<span style="font-size:18px;">int iValue = http://www.mamicode.com/(int)digits[0]-(int)'0';

直接通过了强制类型转换进行数值的转换,剩下的任务就是异常判断以及是否为科学计数法。


总结:从上面可以看出,从算法本身来讲,Java简直弱爆了,一个用C语言十几行代码就能实现的算法,用Java却达到了一百来行的代码。