刚学 C 遇到一个问题,double 的...

2014-09-23 17:41:14 +08:00
 lisonfan
double r,h;
double pai;
double tj;
pai=3.14;
printf("请输入半径:");
scanf("%g",&r);
printf("请输入高:");
scanf("%g",&h);
tj=pai*r*r*h;
printf("体积:%g",tj);
这代码没错吧。。。
怎么最后输出结果是0..
2586 次点击
所在节点    问与答
12 条回复
ggarlic
2014-09-23 17:53:53 +08:00
把你scanf里的%g换成%lf

原因:
printf其实会类型提升
scanf不会
所以你在printf下写%f %g都一样,float会转为double
但是在scanf下,%g就是float,%lf才是double
Plumes
2014-09-23 17:54:54 +08:00
scanf里面改成 %lg
%g 对应的是 float
lisonfan
2014-09-23 18:04:45 +08:00
@Plumes 你好,我还有一个疑问就是最后输出的结果只取小数点后面3位,第四位就会四舍五入。
int main(int argc, char *argv[]) {
double r,h;
double pai;
double tj;
pai=3.1415926535;
printf("请输入半径:");
scanf("%lg",&r);
printf("请输入高:");
scanf("%lg",&h);
tj=pai*r*r*h;
printf("体积:%g",tj);
return 0;
}
lisonfan
2014-09-23 18:06:18 +08:00
@Plumes 要怎样才不会四舍五入?应该如何修改?谢谢
Plumes
2014-09-23 18:11:05 +08:00
@lisonfan
printf的时候使用 %lf
lisonfan
2014-09-23 18:15:45 +08:00
@Plumes 用%lf也只取小数点后面的6位,然后又四舍五入了.
ggarlic
2014-09-23 18:23:06 +08:00
你要小数点后几位?%.7lf 是小数点后7位
lisonfan
2014-09-23 18:25:40 +08:00
@ggarlic 不能结果输出多少位就显示多少位吗?只能要定义吗?
ggarlic
2014-09-23 18:59:38 +08:00
不能吧,想不到怎么搞

如果你想看最长的有效位数你可以使用ieee754的阶码的最长位数来显示
#include <float.h>
printf("体积:%.*lf", DBL_DIG, tj);
DBL_DIG就是阶码最长位数

然后你会看到最后一位数字总也不对,这你就得学习下计算机里数字怎么存储的了

Python里:
In [1]: 0.1+0.1+0.1-0.2
Out[1]: 0.10000000000000003
LbyG
2014-09-23 20:12:50 +08:00
#include <iostream>
using namespace std;

int main()
{
double a=1.567;
a=int(a*100)/100.0;
printf("%.2lf",a);
return 0;
}
这样就可以输出1.56了,不知道楼主是不是这个意思
ggarlic
2014-09-23 22:27:43 +08:00
@LbyG 楼主的意思是自适应位数,结果是两位就显示两位,结果是5位就显示5位。不是这种每次都手动指定位数的做法
msg7086
2014-09-24 07:21:13 +08:00
@lisonfan 计算机的浮点数的位数是2进制的概念,在10进制里讨论没意义。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/135217

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX