C++中将从文件中读取的字符串转为double类型?

wycszh 2012-08-28 11:03:12

ifstream fin;
fin.open("vertex.txt");
char *p1=new char[255];
char *p2=new char[255];
char *p3=new char[255];
while(true)
{
fin.getline(p1,255,'\n');
fin.getline(p2,255,'\n');
fin.getline(p3,255,'\n');
double xnum=atof(p2);
double ynum=atof(p3);
}
其中获取的p2为:113.177230145951
p3为:23.4761739216854
用atof函数转换的时候p2的转换时正确的113.17723014595100,p3转换就出问题了,变为23.476173921685401,最后一位变为1??这个是哪里的问题,要怎么改??
...全文
1284 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisikaipu 2012-08-30
  • 打赏
  • 举报
回复
int main()
{
double d=23.4761739216854;
char str[20]; // 适当的大小
sprintf(str,"%.13f\n",d);

return 0;
}
hong_qi 2012-08-30
  • 打赏
  • 举报
回复
可以用sprintf()
wycszh 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
引用 17 楼 的回复:最后两位是在用atof转换的时候自己添加的,我希望最后不要多那两位就可以了!!这要怎么转换??

别说atof,就是你直接写double d=23.4761739216854;结果也是映射成23.476173921685401


C/C++ code
int main()
{
double d=23.4761739216854; // 映射到一个浮……
[/Quote]
如果再把double型数据(23.476173921685401)转成字符串,存入文本文件中,把最后两位舍弃,应该怎么写??
其中的大部分数据都是类似:113.177230145951 23.4761739216854这么多位的数据??求教,应该肿么写????
northcan 2012-08-29
  • 打赏
  • 举报
回复
float的精度问题,使用上就是这样。
如果是想显示的和原来一样,格式化的时候去掉后面两位。
yisikaipu 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]最后两位是在用atof转换的时候自己添加的,我希望最后不要多那两位就可以了!!这要怎么转换??[/Quote]

别说atof,就是你直接写double d=23.4761739216854;结果也是映射成23.476173921685401

int main()
{
double d=23.4761739216854; // 映射到一个浮点值
// 该值的编码为
// 40 37 79 e6 88 bc d8 cc
//
// 折算成十进制就是
// 23.476173921685401
//
// 而紧挨它的两个浮点值的编码分别是
// 比它小一点点的
// 40 37 79 e6 88 bc d8 cb
// 和比它大一点点的
// 40 37 79 e6 88 bc d8 cd

// 编码的其它位都一样,只有最低位分别是cb/cc/cd

// 折算成十进制分别是
// 23.476173921685398
// 23.476173921685405

// 再把这三个数排在一起
// 23.476173921685398
// 23.476173921685401
// 23.476173921685405

// 看到了吧,你所需要的
// 23.476173921685400
// 在这个数列里并不存在,只能映射一个最接近的给你
//
// 不管你要不要最后两位,它都在那里,只是你可以假装看不见


printf("%.15f\n",d);
printf("%.13f\n",d); // 假装看不见
return 0;
}
Corner 2012-08-29
  • 打赏
  • 举报
回复
你用来干嘛呢?如果是浮点数比较,本身就是要用考虑精度的,两个数的差值在一定精度内就认为是相等的
比如:

#define MIN_DIF 0.00000001
float a = 13.45;
float b = 13.45000000000001;
if(a - b < MIN_DIF && a - b > -MIN_DIF)
{
cout<<"a equals b"<<endl;
}

如果是要显示的话,你自己可以控制显示小数点后几位。
wycszh 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 5 楼 的回复:

两个字符串的小数位数都没有超过15位啊??

所以说你不知道什么叫精度

0.3的精度是多少?是小数点后1位
0.300000的精度是多少?是小数点后6位

你的两个字符串内写明的小数位数都没有超过15位,计算机也相应的保证了这15位的数字和你的字符串完全相符,精度上完全没有问题
你非要求“再后面两位不能多出个01来(必须是00)”,这不叫提高精度要求……
[/Quote]
最后两位是在用atof转换的时候自己添加的,我希望最后不要多那两位就可以了!!这要怎么转换??
baichi4141 2012-08-28
  • 打赏
  • 举报
回复
又一个不懂什么叫做精度的
double的精度是15~16位,不是说从第17位开始全部是0,全部是0全部是1全部是9那都是精度。它的意思是,从第17位开始的数字就不由你控制了
例如你设个double x = 0.3,你可以看看x的实际值,是0.3000000……从第15个0往后就不确定了。这里的不确定指的是“不像你希望的那样”

具体原理2楼说过了,根本原因在于double等浮点数的格式不能精确表示任意十进制小数,就像你用十进制没办法表示任意精度的三进制小数一样
5t4rk 2012-08-28
  • 打赏
  • 举报
回复
你要求的精度有那么高吗。

yisikaipu 2012-08-28
  • 打赏
  • 举报
回复
把浮点数是一个数列上的离散点

你给出任何一个实数,计算机尝试着把这个实数映射到数列上最接近它的那个点

最接近实数23.4761739216854的那个点,就是浮点数23.476173921685401了

而实数113.177230145951刚好能映射到一个113.17723014595100的浮点数上
Corner 2012-08-28
  • 打赏
  • 举报
回复
精度问题,无法避免。LZ结帖率这么低,稍微麻烦的问题大家就不会回答了……
olderma 2012-08-28
  • 打赏
  • 举报
回复
精度也太高了吧
dic_008 2012-08-28
  • 打赏
  • 举报
回复
你这是要登月吗?计算这么精确?
dragonliu1989 2012-08-28
  • 打赏
  • 举报
回复
精度的问题吧
yisikaipu 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]int充其量10位有效数字,整型数的优点是精确而不是精度
同样是有理数轴上的离散数列,占用内存是int两倍的double,精度理所当然高得多[/Quote]

按这么说的话,精度都是一样的,可以用64位整型 long long

double 8字节
8字节long long整型能表示多少个数?2的64次方个。很多。但总是有限的
8字节浮点数能表示的浮点数的个数,不会超过8字节整型能表示的整数的个数

因为浮点数是这样来的:

把8字节整型的所有数字放到数列上,两个紧挨的数的间隔总是1

然后,把每两个紧挨的数的间隔做一下调整

越靠近0的地方,间隔调得越小,越远离0的地方,则越大。具体怎么调呢,一般都依据IEEE标准

共有2的11次方个不同的间隔值,每2的52次方个数共享同一个间隔值

数还是那么多点数,只是表示的跨度就大多了

整数映射到一个间隔均匀位1的数列上

实数映射到一个间隔不均匀的数列上
baichi4141 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
浮点数在进算机中都有精度误差。 如果对对精度要求高,不妨转换为整形:double v = 0.123456789;
可以转换为 int expponent = 123456789; int mantisa = -9;
[/Quote]
int充其量10位有效数字,整型数的优点是精确而不是精度
同样是有理数轴上的离散数列,占用内存是int两倍的double,精度理所当然高得多
yisikaipu 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]两个字符串的小数位数都没有超过15位啊??[/Quote]

有效位数 不是 小数点后位数

baichi4141 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

两个字符串的小数位数都没有超过15位啊??
[/Quote]
所以说你不知道什么叫精度

0.3的精度是多少?是小数点后1位
0.300000的精度是多少?是小数点后6位

你的两个字符串内写明的小数位数都没有超过15位,计算机也相应的保证了这15位的数字和你的字符串完全相符,精度上完全没有问题
你非要求“再后面两位不能多出个01来(必须是00)”,这不叫提高精度要求叫什么?
whucv 2012-08-28
  • 打赏
  • 举报
回复
正解[Quote=引用 2 楼 的回复:]
把浮点数是一个数列上的离散点

你给出任何一个实数,计算机尝试着把这个实数映射到数列上最接近它的那个点

最接近实数23.4761739216854的那个点,就是浮点数23.476173921685401了

而实数113.177230145951刚好能映射到一个113.17723014595100的浮点数上
[/Quote]
mujiok2003 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 3 楼 的回复:
你要求的精度有那么高吗。

是啊,要不也不会那么纠结了!!
[/Quote]


浮点数在进算机中都有精度误差。 如果对对精度要求高,不妨转换为整形:double v = 0.123456789;
可以转换为 int expponent = 123456789; int mantisa = -9;
加载更多回复(3)

65,202

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧