实现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 ...
随机推荐
- [Jsoi2011]分特产
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...
- poj 2417 && poj3243(Baby-Step Giant-Step)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4624 Accepted: 2113 ...
- (MariaDB/MySQL)之DML(2):数据更新、删除
本文目录:1.update语句2.delete语句 2.1 单表删除 2.2 多表删除3.truncate table 1.update语句 update用于修改表中记录. # 单表更新语法: UPD ...
- jQuery简介和基础
一.函数变量的作用域 1.变量的作用域实在声明时决定的而不是调用执行时决定 <script> var a=6,b=7; function t() { // var a=3,b=5; con ...
- ScalaPB(0): 找寻合适的内部系统微服务集成工具
前一段时间我们探讨了SDP的一个基于集群的综合数据平台解决方案,由多种数据库组成,包括:JDBC, Cassandra 及MongoDB.其中Cassandra和MongoDB属于分布式数据库,可以在 ...
- python map filter reduce的优化使用
这篇讲下python中map.filter.reduce三个内置函数的使用方式,以及优化方法. map()函数 map()函数会根据提供的函数对指定序列做映射. 语法: map(function,it ...
- Java获取随机数的3种方法
最小值---最大值(整数)的随机数 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math.random()*(10-1+1)) / ...
- JVM之Java虚拟机详解
这篇文章解释了Java 虚拟机(JVM)的内部架构.下图显示了遵守Java SE 7 规范的典型的 JVM 核心内部组件. 上图显示的组件分两个章节解释.第一章讨论针对每个线程创建的组件,第二章节讨论 ...
- 线性回归(Linear Regression)均方误差损失函数最小化时关于参数theta的解析解的推导(手写)
第一页纸定义了损失函数的样子, theta, X 和 y 的 shape, 以及最终的损失函数向量表现形式. 第二页纸抄上了几个要用到的矩阵求导公式,以及推导过程和结果. 要说明的是:推导结果与the ...
- gcc创建静态库和共享库
静态库和动态(共享)库静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其 ...