实现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 ...
随机推荐
- ●洛谷P1903 [国家集训队]数颜色
题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...
- 【BZOJ1012】【JSOI2008】最大数maxnumber
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 2015 多校联赛 ——HDU5373(模拟)
Problem Description In this problem, we should solve an interesting game. At first, we have an integ ...
- const的一些用法和理解
首先先说一下const常量的用处,我们知道宏定义#define是没有数据类型的,编译器在编译的时候,不会对宏常量进行类型检查,只进行简单的字符串替换,字符串替换时极易产生意想不到的错误,所以这个时候, ...
- Java Native方法
一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...
- spring的 @Scheduled的cron表达式
网上太多说的多,但却没什么用的文章了 序号 说明 是否必填 允许填写的值 允许的通配符1 秒 是 0-59 , ...
- JavaScript数据结构和算法----队列
前言 队列和栈很像,只是用了不同的原则.队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素.最新添加的元素必须必须排队在队列的,末尾.可以想象食堂排队买饭的样子. ...
- RabbitMQ日志无法禁用问题
最近使用spring+rabbitmq发现其Debug日志非常多,几天就把服务器磁盘弄爆了. 原来rabbitmq依赖logback.xml输出日志. 在和log4j.properties同目录下加一 ...
- MeshCollider双面化脚本
由于MeshCollider组件可以挂载多个,所以不需要Mesh重新合并了. 除了反转法线还需要反转所有三角面的顺序 脚本如下: using System.Collections; using Sys ...
- Python中什么是变量Python中定义字符串
在Python中,变量的概念基本上和初中代数的方程变量是一致的. 例如,对于方程式 y=x*x ,x就是变量.当x=2时,计算结果是,当x=5时,计算结果是25. 只是在计算机程序中,变量不仅可以是数 ...