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