字符串转为 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);
}

方法 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;
}

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

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

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

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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值