实现string到double的转换
分析:此题虽然类似于atoi函数,但毕竟double为64位, 而且支持小数,因而边界条件更加严格,写代码时需要更加注意。
#include <errno.h> #include <float.h> #include <stdio.h> #include <stdlib.h> #include "math.h" enum status { invaild = 0, vaild }; int g_status = vaild; int isspace(const char* str) { return *str == ' '; } int isDigit(char num) { if (num >= '0' && num <= '9') { return 1; } else { return 0; } } //对atof函数进行扩充,使其可以处理科学计数法形式的字符如 123.45e-6 double strToDouble(const char* nptr) { double val = 0, power = 1; int exp = 0; if (nptr == NULL) { return 0; } g_status = invaild; //跳过空格 while (*nptr == ' ') { nptr++; } int flag = *nptr == '-' ? -1 : 1; if (*nptr == '-' || *nptr == '+') { nptr++; } while (isDigit(*nptr)) { val = val * 10 + *(nptr++) - '0'; } if (*nptr == '.') { nptr++; } while (isDigit(*nptr)) { val = val * 10 + *(nptr++) - '0'; power *= 10; } val = val / power; if (*nptr == 'e' || *nptr == 'E') { nptr++; int eflag = *nptr == '-' ? -1 : 1; if (*nptr == '-' || *nptr == '+') { nptr++; } while (isDigit(*nptr)) { exp = exp * 10 + *(nptr++) - '0'; } //是否越界 // else if (eflag == 1) { if (val > DBL_MAX * pow(10.0, (double) -exp)) { return DBL_MAX; } while (exp-- > 0) { val *= 10; } } else if (eflag == -1) { if (val < DBL_MIN * pow(10.0, (double) exp)) { return DBL_MIN; } while (exp-- > 0) { val /= 10; } } } if (*nptr == '\0') { g_status = vaild; } return flag * val; } int main(void) { // DBL_MIN: 2.2250738585072014e-308 // DBL_MAX: 1.7976931348623157e+308 setvbuf(stdout, NULL, _IONBF, 0); char str[100] = "1.79e308"; double num; num = strToDouble(str); if (g_status) { printf("%.16e\n", num); } else { printf("%s", "invaild input!!!"); } return EXIT_SUCCESS; }
实现string到double的转换的更多相关文章
- double型转换成string型
double型转换成string型 题目描写叙述: 如有一个函数.其可接受一个long double參数,并将參数转换为字符串.结果字符串应保留两位小数,比如,浮点值123.45678应该生成&quo ...
- string与double的互相转换
#include <iostream> #include <string> #include <sstream> string DoubleToString(dou ...
- string和double之间的相互转换(C++)
很多人都写过这个标题的文章,但本文要解决的是确保负数的string和double也可以进行转换. 代码如下: string转double double stringToDouble(string nu ...
- 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30; int y=30; x==y; //true 基本数据类型 简单类型(基本类型) bo ...
- String转double失去精度问题
最近遇到一个坑,微信小程序中退款 19.9的字符串转double变成19.89,导致退不成功 . 坑死我了.现在把更改后的代码贴出来 public static void main(String[] ...
- 与String有关的强制转换
String --> int int i = Integer.parseInteger("123"); String --> double double d = Dou ...
- go中string和slice no-copy转换
在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存. 通常,我们不会在意string和slice的转换带来的内存拷贝性 ...
- string 到 wstring的转换
string 到 wstring的转换_一景_新浪博客 string 到 wstring的转换 (2009-08-10 20:52:34) 转载▼ 标签: 杂谈 ...
- 利用Gson进行String和对象的转换
利用Gson进行String和对象的转换 /** * 从JsonStr中解析BUserBase * @param jsonStr * @return */ public static BUserBas ...
随机推荐
- [USACO17FEB]Why Did the Cow Cross the Road II S
题目描述 The long road through Farmer John's farm has crosswalks across it, conveniently numbered (). ...
- ●BZOJ 1492 [NOI2007]货币兑换Cash
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1492 题解: 斜率优化DP,CDQ分治 定义$DP[i]$为第i天结束后的最大收益. 由于题 ...
- Tensorflow 基于分层注意网络的文件分类器
After the exercise of building convolutional, RNN, sentence level attention RNN, finally I have come ...
- JavaScript数据结构和算法----栈
前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的 ...
- vscode 常见插件及配置 备忘
配置 // 以下解决格式化js自动添加分号 "prettier.singleQuote": true, "prettier.semi": false, // 以 ...
- Centos 6.5 安装 rar
wget http://www.rarsoft.com/rar/rarlinux-x64-5.4.0.tar.gz tar -zxvf rarlinux-x64-5.4.0.tar.gz cd rar ...
- css文本超出省略号
终于完成了项目了,今天我就分享自己在项目中比较实用的一些功能的实现,第一个就是纯css文本超出省略号 /* 文本单行超出省略号 */ .textels { overflow: hidden; text ...
- Ubuntu 搭建 GlusterFS 过程笔记
https://download.gluster.org/pub/gluster/ #要安装的东西 ---- ``` apt install -y build-essential gcc make c ...
- compress函数用法详解
compress函数: 主要用来删除字符串中的特定字符. 1.compress函数的基本形式compress(<source><, chars><, modifiers& ...
- 关于基因组注释文件GTF的解释
GTF文件的全称是gene transfer format,主要是对染色体上的基因进行标注.怎么理解呢,其实所谓的基因名,基因座等,都只是后来人们给一段DNA序列起的名字而已,还原到细胞中就是细胞核里 ...