请教c++中如果把char*转为double,并且小数点后保留2位有效数字

wwwww112233 2017-03-10 03:20:48
如题,
有一个 char* = 183.0000000000000001
要把他变成四舍五入保留2为有效数字 183.00 放入变量之中。所以printf之类的应该不行。

目前百度了一大堆,没有一个能用的,真是悲剧啊。
我现在的代码
price = atof(p);
price = ((int)(price * 1000)) / 1000.0;
这个price 得到 183.0000000000000001,所以这个不行。

sscanf(s, "%lf", &price);
这个和上面一样,也不行。

没想到搞c++第一个难题居然是这个.....
求高手指点

...全文
1303 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-14
  • 打赏
  • 举报
回复
相由心生。 一切都是神马浮云。
勤奋的小游侠 2017-03-13
  • 打赏
  • 举报
回复
引用 12 楼 logy_fish 的回复:
用Double表示183.00,Debug下是183.00000001这是二进制表示十进制的问题,一般两个Double值相差小于认可的误差,就认为两个值是相同的。 如果必须要表示成183.00,可以用两个int来保存,一个保存整数,一个保存小数。
不存在这种问题 183和183.00是同一个值 的。 二进制表示不了十进制只在小数中才存的。 183和183.00二个都是整数,不存在二进制分数无法表示十进制分数的问题。 所以题主所说的问题说183.00最后会被表示成183.00000001,我强烈表示怀疑。
logy_fish 2017-03-10
  • 打赏
  • 举报
回复
用Double表示183.00,Debug下是183.00000001这是二进制表示十进制的问题,一般两个Double值相差小于认可的误差,就认为两个值是相同的。 如果必须要表示成183.00,可以用两个int来保存,一个保存整数,一个保存小数。
勤奋的小游侠 2017-03-10
  • 打赏
  • 举报
回复
引用 5 楼 wwwww112233 的回复:
[quote=引用 3 楼 zgl7903 的回复:]

  char *psf = "183.0000000000000001";  
  char chBuff[128];
  sprintf(chBuff, "%.2lf", atof(psf));
  double fi = atof(chBuff);
回复3楼: 谢谢,你这个代码也是限于打印出来是183.00. 但是当我把fi赋值给函数的时候,debug下看到他的值仍然是183.0000000000000001 而不是183.00 [/quote] 怎么可能,我这边看的fi就是183.00000000000000,最后面没有1. 你是怎么看fi的?
	char *psf = "183.00";
	double fi = atof(psf);
你用这代码看看fi是什么就知道了,多是你看走眼了。
幻夢之葉 2017-03-10
  • 打赏
  • 举报
回复
二进制是不能精确表示浮点数,它只保证有效精度。 你在打印的时候控制输出,或者写入文件的时候控制小数位数 那跟你需要的有什么本质的差别吗 除非你做的是极高精度的运算的时候才有影响,要是这样子你就应该使用第三方的一些高精度计算用的库
赵4老师 2017-03-10
  • 打赏
  • 举报
回复
fefe82 2017-03-10
  • 打赏
  • 举报
回复
如果没有更详细的需求的话,只能告诉你, double 做不到。 原因很简单,double 是二进制数,你要求的两位有效数字是对十进制说的。 绝大部分十进制小数,没法用有限位二进制小数表示。 ================================= 就像十进制小数表示不了 1/3 一样,二进制小数无法表示 1/5 。
wwwww112233 2017-03-10
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
double 型的精度位数能有那么多?
不好意思,我发帖的时候为了快按住了,所以出几个0. 实际中大概3,5个0. 就是类似1231.0012,1231.000002
zgl7903 2017-03-10
  • 打赏
  • 举报
回复
double 型的精度位数能有那么多?
wwwww112233 2017-03-10
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:

  char *psf = "183.0000000000000001";  
  char chBuff[128];
  sprintf(chBuff, "%.2lf", atof(psf));
  double fi = atof(chBuff);
回复3楼: 谢谢,你这个代码也是限于打印出来是183.00. 但是当我把fi赋值给函数的时候,debug下看到他的值仍然是183.0000000000000001 而不是183.00
wwwww112233 2017-03-10
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
d1=183.0000000000000001; d2=183.0000000000000001; printf("d1 = %.2lf, d2 = %.2lf\n", d1, d2); %.2lf 这个需求很难?
回复1楼: 你这个代码直接打印出来是没问题,但是我要的是存入变量中。 你这个代码我debug下看了,price的值没变的,还是183.0000000000000001,只是打印在屏幕上是183.00 这个问题对于c++的老手或许不难,但是目前为止,我百度了很久也都是像你这样的答案为主。
zgl7903 2017-03-10
  • 打赏
  • 举报
回复

  char *psf = "183.0000000000000001";  
  char chBuff[128];
  sprintf(chBuff, "%.2lf", atof(psf));
  double fi = atof(chBuff);
vnvlyp 2017-03-10
  • 打赏
  • 举报
回复
完全不知道你要干什么。 贴个完整一点的代码
勤奋的小游侠 2017-03-10
  • 打赏
  • 举报
回复
d1=183.0000000000000001; d2=183.0000000000000001; printf("d1 = %.2lf, d2 = %.2lf\n", d1, d2); %.2lf 这个需求很难?

65,202

社区成员

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

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