首页 > 代码库 > 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是一个简单到爆的“算法””
本文核心是想理解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却达到了一百来行的代码。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。