• 字符串转为 double 类型


    目标

    将字符串转为 double 类型。转自 c程序设计语言第2版。

    方法 1:

    整数部分、小数部分单独计算,然后相加。

    • 整数部分转换参考这篇文章
    • 小数部分使用如下公式。

    0.1234 = 1 * 10-1 + 2 * 10-2 + 3 * 10-3 + 4 * 10-4

    得到每位数,从前往后,每项依次除以 10、100、1000…

    所以 power 默认从 10 开始,每次循环乘以 10。

    double atof(char s[]) {
        int sign = 1;
        int i = 0;
        switch (s[0]) {
            case '-':
                sign = -1;
                i = 1;
                break;    
            case '+':
                i = 1;
                break;
        }
    	int n = 0;
        while (s[i] >= '0' && s[i] <= '9') {
            n = 10 * n + s[i] - '0';
            i++;
        }
        if (s[i] == '.') {
            i++;
        }
        double f = 0.0;
        double power = 10.0;
        while (s[i] >= '0' && s[i] <= '9') {
            f = f + (s[i]-'0') / power;
            i++;
            power *= 10;
        }
        return sign * (n+f);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    方法 2:

    整体当作整数,算完后小数点左移。

    如 123.456,先得到 123456 再除以 1000。

    但注意如果 n 使用 int 类型存储,则很容易溢出。

    如 3333.333333,先得到 3333333333,超出 2147483647 溢出,实际值为负数,那么之后的一系列运算全错。

    double atof(char s[]) {
        int sign = 1;
        int i = 0;
        switch (s[0]) {
            case '-':
                sign = -1;
                i = 1;
                break;    
            case '+':
                i = 1;
                break;
        }
    	double n = 0.0;
        while (s[i] >= '0' && s[i] <= '9') {
            n = 10 * n + (s[i] - '0');
            i++;
        }
        if (s[i] == '.') {
            i++;
        }
        double power = 1.0;
        while (s[i] >= '0' && s[i] <= '9') {
            n = 10 * n + (s[i] - '0');
            i++;
            power *= 10;
        }
        return sign * n/power;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    这几天反思了之前 4 天在工厂的作为。工厂空位太少,所以刚新生产出来的半成品,只能是哪里有空就塞哪里。包装工需要的货物被压在最里面,类似推箱子游戏,拉出需要的箱子后再回填。

    并非是动辄搬运几百斤的大东西,而是二十几斤的塑料制品,都不用扛在肩上,不是很累,还 OK,就是每天走 3 万步对我这个宅,腿有些酸。并且大多是无效工作,再加上要记住 50 亩内堆积如山的货物型号与数量,绝大多数货物上没有贴上标签编号、数量,只有熟练的包装工、生产线上的员工比较熟悉,所以继续待下去,以后一定会变为地狱模式,不适合自己,也学不到什么东西,于是第 2 天就打起了退堂鼓。

    阿姨忙完后,说感觉怎么样,问我是不是来体验生活的。我明白什么意思了,我想了想要为年轻人争口气,于是继续做,有些赌气的意味。

    到了第 4 天,我身上都热烂了,也顾不上什么沉没成本,再赌下去,我更吃亏,工钱没拿,还是辞了。至于工厂五十多岁的阿姨、大叔,若是看见我没来,可能闲谈时说早就知道现在年轻人吃不得这个苦,对我们 95 后的印象更差,那我管不了了。

    我不禁想起了以前在武汉工作的时候,师傅跟我说,别看这些阿姨做的是保洁、保安和我一样的工作,就觉得她们和我一样没有钱,她们甚至可能拥有好几套房,孩子也是高学历,在北上广深拿着上万月薪,阿姨们只是闲不住,顺便在这工作拿点零花钱,养老,还有个伴。

    至少比别人落后了 30 年,再看着网上流行的段子:比你优秀的人还比你努力,其实领先我十万年踏入神之阶层也无所谓,有音乐、小说陪伴着我足够。除了技能与工作外,提升自己的情商、交谈能力、上下打点、“人情世故”、“融入集体”、隐式溜须拍马、语句斟酌、反应速度、八面玲珑、不得罪人,一条都没沾上,以后慢慢学吧。

  • 相关阅读:
    2. Java变量
    阿里云国际站:密钥管理服务
    在MySQL中使用!=还能走索引吗?
    不安全的反序列化
    绿盾加密如何顺利切换成IP-Guard加密
    涉及rocketMQ,jemeter等性能测试服务器的安装记录
    入职字节外包一个月,我离职了
    AM@由极限的两个存在准则(定理)推导的两个重要极限
    27-spark各版本对比
    EMI测试的应用及相关的测试标准
  • 原文地址:https://blog.csdn.net/cqh123hh/article/details/126465095