- 题目描述
实数以字符串的形式给出,把它转换成double类型。
- 值得学习的地方
注意下面代码中处理小数点的方法,非常值得学习,以前都是分为两部分计算(小数点前的整数,小数后的小数),这种方法太笨了。下面的代码中处理小数点的办法非常聪明。是和科学计数法后面的scale一起处理的。
- 代码
double parse_number(const char* num)
{
double n = 0, sign = 1, scale = 0; int subscale = 0, signsubscale = 1;
if (*num == '-') sign = -1, num++; /* 有符号? */
if (*num == '0') num++; /* 0 */
if (*num >= '1' && *num <= '9') do n = (n * 10.0) + (*num++ - '0'); while (*num >= '0' && *num <= '9'); /* 数字? */
if (*num == '.' && num[1] >= '0' && num[1] <= '9') { num++; do n = (n * 10.0) + (*num++ - '0'), scale--; while (*num >= '0' && *num <= '9'); } /* Fractional part? */
if (*num == 'e' || *num == 'E') /* 科学计数法?*/
{
num++; if (*num == '+') num++; else if (*num == '-') signsubscale = -1, num++; /* 有符号? */
while (*num >= '0' && *num <= '9') subscale = (subscale * 10) + (*num++ - '0'); /* 数字? */
}
n = sign * n * pow(10.0, (scale + subscale * signsubscale)); /* number = +/- number.fraction * 10^+/- 指数部分 */
return n;
}