繁体   English   中英

实现以下函数,将浮点数的字符串表示形式转换为双精度数:

[英]Implement the following function which converts a string representation of a floating-point number into a double:

实现以下函数,将浮点数的字符串表示形式转换为双精度数:

双 strToDouble(char[] str)

您的实现应该能够正确处理字符串,例如:

  • “123456”
  • “-123.456”
  • “123.456e13”
  • “123.456e-13”

任何格式不正确的输入字符串都应导致返回值 0.0。

提示和建议:

  • 使用上面的函数 strToInt 作为起点。
  • 在第一个循环后使用 if 语句来检查小数点、e(用于科学记数法指数)和负号等内容。
  • 使用单独的循环处理可能的小数点后的内容。
  • 使用另一个循环来处理 e 之后可能的指数值。

我在调用函数 strToDouble 后如何回答

1)应该是正确的输出是这样的:

123456
-123.456000
1234560000000000.000000
0.000000

2)为什么我们需要放[i + 2]和[i+1]?我是随机放的,但我没有解释。

——

double strToDouble(const char str[]) {
    int i = 0, k = 10;
    double result = 0, doubleValue, expValue = 0, resultDecimal = 0;
    double exp = 1;

    if (str[0] == '-')
    {
        i++;
    }

    while (str[i] >= '0' && str[i] <= '9')
    {
        doubleValue = str[i] - '0';
        result = result * 10 + doubleValue;
        i++;
    }

    if (str[i] == '.')
    {
        while (str[i + 1] >= '0' && str[i + 1] <= '9')
        {
            doubleValue = (str[i + 1] - '0');
            resultDecimal = resultDecimal + doubleValue / k;
            k *= 10;
            i++;
        }
    }


    if (str[i + 1] == 'e')
    {
        if (str[i + 2] == '-')
        {
            while (str[i + 3] >= '0' && str[i + 3] <= '9')
            {
                doubleValue = str[i + 3] - '0';
                expValue = expValue * 10 + doubleValue;
                i++;
            }
            for (k = 0; k < expValue; k++)
            {
                exp /= 10;
            }
        }
        else
        {
            while (str[i + 2] >= '0' && str[i + 2] <= '9')
            {
                doubleValue = str[i + 2] - '0';
                expValue = expValue * 10 + doubleValue;
                i++;
            }
            for (k = 0; k < expValue; k++)
            {
                exp *= 10;
            }
        }
    }

    result = (result + resultDecimal) * exp;

为什么我们需要放[i + 2][i+1] ?我是随机放的,但我没有解释。

这些随机偏移会破坏您的代码。 它适用于给定的示例,但如果您没有指定句点而是指数,例如“1e3”,它会中断,因为即使没有时期:

if (str[i] == '.') {
    // parse mantissa, using i + 1 as index
}

if (str[i + 1] == 'e')     // i + 1 may be one beyond the character you
                           // should be looking at.

只有当你真的找到一个时,你才应该在句号后推进当前字符:

if (str[i] == '.') {
    i++;            // step over period
    // parse mantissa, using i as index
}

if (str[i] == 'e') {
    i++;           // step over 'e'
    // parse exponent, using i as index
}

跨过符号+ (您似乎根本没有处理)和- (您检测到,但不在结果中考虑)也是如此。

换句话说:您当前正在检查的字符应始终位于索引i 你可以向前看,但只能在上下文中。 当您向前看时,您还应该确保您看到的字符不在可能的空终止符之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM