不明白这两个函数的作用,目的为什么最后的返回是m,s1?

我在做一个工资管理系统,以下俩个函数代码总是看不懂,有没有可以帮忙解释以下,功能作用,注释


double    string_to_double(string& s1)    
                    {
                    
                    int left=0;
                    double    num=0;
                    int i=0;
                    while(i<s1.size())
                        {
                        if(s1[i]=='.')
                            break;
                            
                        i++;
                        left++;    
                        }
                    i++;
                
                    for(double j=0.1;i<s1.size();j=j*0.1,i++)    
                        {    
                        num+=(s1[i]-48)*j;
                        }
                    
                    int k=0;
                    while(left--)    
                        {
                        int i=1;
                        for(int j=0;j<left;j++)
                            i=i*10;
                        num+=(s1[k]-48)*i;
                        k++;
                        }
                        
                    return num;
                }

string double_to_string(double num)        //double限两位小数 限1500000000以内 
    {
    
    string    s1;
    int i=num;    //整数部分 
    num=num-i;    //小数部分 
    string    temp;
    while(i!=0)
        {
        temp+=i%10+48;
        i=i/10;
        } 
    
    for(i=temp.size()-1;i>=0;i--)
        s1+=temp[i];
    if(num==0)
    return s1;
    s1+='.';
    for(i=0;i<2;i++)
        {
        num=num*10;
        s1+=(int)num%10+48;
        }
        
    return s1;
    }

// 将 string 类型的字符串 s1 转换为 double 类型
// 函数传入一个 string 类型的数据,返回一个 double 类型的数据
double string_to_double(string& s1)
{
    int left = 0;
    double    num = 0;
    int i = 0;
    while (i < s1.size())
    {
        if (s1[i] == '.')
            break;
        i++;
        left++;
    }
    i++;
    for (double j = 0.1; i < s1.size(); j = j * 0.1, i++)
    {
        num += (s1[i] - 48) * j;
    }
    int k = 0;
    while (left--)
    {
        int i = 1;
        for (int j = 0; j < left; j++)
            i = i * 10;
        num += (s1[k] - 48) * i;
        k++;
    }
    return num;
}

// 将数字 num 转换为 string 类型
// 函数传入一个 double 类型的数据,返回一个 string 类型的数据
string double_to_string(double num)        //double限两位小数 限1500000000以内 
{
    string    s1;
    int i = num;    //整数部分 
    num = num - i;    //小数部分 
    string    temp;
    while (i != 0)
    {
        temp += i % 10 + 48;
        i = i / 10;
    }
    for (i = temp.size() - 1; i >= 0; i--)
        s1 += temp[i];
    if (num == 0)
        return s1;
    s1 += '.';
    for (i = 0; i < 2; i++)
    {
        num = num * 10;
        s1 += (int)num % 10 + 48;
    }
    return s1;
}


double    string_to_double(string& s1)       //string类型转换为double类型
{
    int left = 0;                            
    double    num = 0;
    int i = 0;
    while (i < s1.size())                    //通过s1长度循环执行确定整数部分长度
    {
        if (s1[i] == '.')                    //执行到.后停止
            break;
        i++;                                 
        left++;                              //left记录整数部分长度
    }
    i++;
    for (double j = 0.1; i < s1.size(); j = j * 0.1, i++)   //计算小数部分值
    {
        num += (s1[i] - 48) * j;
    }
    int k = 0;
    while (left--)
    {
        int i = 1;
        for (int j = 0; j < left; j++)              //计算整数部分值
            i = i * 10;
        num += (s1[k] - 48) * i;
        k++;
    }
    return num;
}
string double_to_string(double num)        ////double类型转换为string类型
{
    string    s1;
    int i = num;    //整数部分 ,强制转换为int型会自动省略小数部分
    num = num - i;    //小数部分 
    string    temp;
    while (i != 0)
    {
        temp += i % 10 + 48;    //参考ascii表,数字与字符差48
        i = i / 10;
    }
    for (i = temp.size() - 1; i >= 0; i--)   //记录整数部分
        s1 += temp[i];
    if (num == 0)
        return s1; 
    s1 += '.';
    for (i = 0; i < 2; i++)             //记录小数部分
    {
        num = num * 10;
        s1 += (int)num % 10 + 48;
    }
    return s1;
}