C++新手小白求助大佬!!!(int)12.000000怎么就变成11了?!

WYHMingMing 2021-02-16 01:38:37
最近我正在跟着一本书——《信息学奥赛一本通(C++版)》学习C++,书后有一道题如下:

【题目描述】
分数ab化为小数后,小数点后第n位的数字是多少?

【输入】
三个正整数a,b,n,相邻两个数之间用单个空格隔开。0<a<b<100,1<=n<=10000。

【输出】
一个数字。

【输入样例】
1 2 1
【输出样例】
5

我的程序如下:


# include <cstdio>
# include <cmath>
using namespace std;
int main()
{
int n, result; //声明整型变量n(小数点后第几位)和result(小数点后第n位小数)
double a, b, number; //生命双精度浮点型变量a(被除数)、b(除数)和number(商(没有余数))
scanf("%lf %lf %d", &a, &b, &n); //用户输入被除数a、除数b和要求的小数点后第几位位数n
number = a / b; //求出商(没有余数)
result = (int)(number / (1.0 / pow(10, n))) % 10;
//number / (1.0 / pow(10, n))求出number里有几个10的-n次方,然后求出个位数即使题目所求,存入整形变量result
printf("%d", result); //输出result
return 0; //结束程序
}


那本书有一个配套的测评网站http://ybt.ssoier.cn:8088/,我把程序传上去之后它说答案错误,我很纳闷,试了几次结果都没出问题,直到我测试6除以5时,发现错误:

【输入】
6 5 1
【输出】
1

我很纳闷,6除以5等于1.2,小数点后第一位应该是2,怎么会是1呢
后来我就在程序中添加了测试行2行,如下:


# include <cstdio>
# include <cmath>
using namespace std;
int main()
{
int n, result; //声明整型变量n(小数点后第几位)和result(小数点后第n位小数)
double a, b, number; //生命双精度浮点型变量a(被除数)、b(除数)和number(商(没有余数))
scanf("%lf %lf %d", &a, &b, &n); //用户输入被除数a、除数b和要求的小数点后第几位位数n
number = a / b; //求出商(没有余数)
result = (int)(number / (1.0 / pow(10, n))) % 10;
//number / (1.0 / pow(10, n))求出number里有几个10的-n次方,然后求出个位数即使题目所求,存入整形变量result
printf("%lf\n", (number / (1.0 / pow(10, n)))); //错误之后添加的测试行,提交时没有,本行输出number里有几个10的-n次方
printf("%d\n", (int)(number / (1.0 / pow(10, n)))); //错误之后添加的测试行,提交时没有,本行输出对上一行结果进行int的结果
printf("%d", result); //输出result
return 0; //结束程序
}


于是输入输出变成了:

【输入】
6 5 1
【输出】
12.000000
11
1

我极度纳闷,(int)12.000000咋就变成了11???!!!

于是我就弄了一个测试程序,如下:


# include <cstdio>
using namespace std;
int main()
{
double a = 12.000000;
printf("%d\n", (int)a);
return 0;
}


结果如下:
【输出】
12

我纳闷至极,都开始怀疑我的视力了,求助各位大佬们,这到底为啥????!!!!

感谢各位大佬!!!望回答!!!
...全文
519 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
WYHMingMing 2021-02-23
  • 打赏
  • 举报
回复
引用 16 楼 快乐胖电工 的回复:
是滴是滴,可能11.99999999
感谢感谢!!!
快乐胖电工 2021-02-22
  • 打赏
  • 举报
回复
是滴是滴,可能11.99999999
WYHMingMing 2021-02-22
  • 打赏
  • 举报
回复
引用 13 楼 赵4老师 的回复:
浮点数格式 http://bbs.csdn.net/topics/390676437
有的挺好,有的没看懂……
WYHMingMing 2021-02-21
  • 打赏
  • 举报
回复
引用 13 楼 赵4老师 的回复:
浮点数格式 http://bbs.csdn.net/topics/390676437
感谢!
赵4老师 2021-02-21
  • 打赏
  • 举报
回复
WYHMingMing 2021-02-19
  • 打赏
  • 举报
回复
引用 11 楼 forever74 的回复:
[quote=引用 10 楼 WYHMingMing 的回复:][quote=引用 9 楼 forever74 的回复:]不用额外计算,1.2无法精确表达,它从来都是以1.1999999999之类的形式存在。 你看到的1.200000只不过是为了保留6位小数而在第七位四舍五入的结果,也就是说,是个假象。
那如何避免我的这种情况呢?[/quote] 这是个哲学问题,你写代码之前得确定,要精确还是要方便? 要精确请上5楼,哦,你都上过了。[/quote] 好的,感谢!!!
forever74 2021-02-18
  • 打赏
  • 举报
回复
引用 10 楼 WYHMingMing 的回复:
[quote=引用 9 楼 forever74 的回复:]不用额外计算,1.2无法精确表达,它从来都是以1.1999999999之类的形式存在。 你看到的1.200000只不过是为了保留6位小数而在第七位四舍五入的结果,也就是说,是个假象。
那如何避免我的这种情况呢?[/quote] 这是个哲学问题,你写代码之前得确定,要精确还是要方便? 要精确请上5楼,哦,你都上过了。
WYHMingMing 2021-02-18
  • 打赏
  • 举报
回复
引用 9 楼 forever74 的回复:
不用额外计算,1.2无法精确表达,它从来都是以1.1999999999之类的形式存在。 你看到的1.200000只不过是为了保留6位小数而在第七位四舍五入的结果,也就是说,是个假象。
那如何避免我的这种情况呢?
forever74 2021-02-17
  • 打赏
  • 举报
回复
不用额外计算,1.2无法精确表达,它从来都是以1.1999999999之类的形式存在。 你看到的1.200000只不过是为了保留6位小数而在第七位四舍五入的结果,也就是说,是个假象。
forever74 2021-02-17
  • 打赏
  • 举报
回复

#include <stdio.h>
int main()
{
	double a = 6. / 5.;
	printf("%lf\n%.22lf\n", a, a);
	return 0;
}
WYHMingMing 2021-02-17
  • 打赏
  • 举报
回复
引用 4 楼 突触 的回复:
//number / (1.0 / pow(10, n))求出number里有几个10的-n次方,然后求出个位数即使题目所求,存入整形变量result 实际上你可以看成,小数点向后移。 式子就变成了number * pow(10, n) % 10 (这里放入程序不会 出现上述问题) 在讲讲 输出结果为11的问题 这里涉及的知识比较多,有兴趣可以去了解下浮点型与16进制的转换关系。 下面作简单讲解: 1.0 / pow(10, n) 的结果为0.1 但是这个数在计算机是没办法存储的,只会存储近似值 大概约等于0.100000000000000006 number 取1.2(实际也取不到,这里为了方便,假设取到了) 那么1.2 / 0.100000000000000006 也就变成了11.99999999999999928 取整数也就是11.
十分感谢!!!感谢大佬!!!!
WYHMingMing 2021-02-17
  • 打赏
  • 举报
回复
引用 5 楼 qzjhjxj 的回复:
楼主的代码,供参考:
//【输入】
//三个正整数a,b,n,相邻两个数之间用单个空格隔开。0<a<b<100,1<=n<=10000。

//【输出】
//一个数字。

//【输入样例】
//1 2 1
//【输出样例】
//5
//例如:13/97=0.13402061855670103092783505154639;
# include  <stdio.h>
# include  <math.h>
using namespace std;
int main()
{
	int n, result,a, b;
	scanf("%d %d %d", &a, &b, &n);
	result = (int)(a*1.0 / b*1.0/(1.0 / pow(10, n))) % 10;
	printf("%d", result); //输出result
	return 0;     //结束程序
}  
//6 5 1
//2请按任意键继续. . .

//13 97 32
//0请按任意键继续. . .

//13 97 10000
//pow: OVERFLOW error   溢出报错
模拟除法的写法,供参考:
//模拟除法过程
//例如:13/97=0.13402061855670103092783505154639;

#include <stdio.h>
using namespace std;

int main()
{
    int a,b,n,c;
    scanf("%d %d %d",&a,&b,&n);
    if(a > b) a = a % b;
    for(int i = 1;i <= n;i ++){
        c = 10 * a / b;
        a = 10 * a - b * c;
    }
    printf("%d\n",c);
    return 0;
}

//6 5 1
//2
//请按任意键继续. . .

//13 97 32
//9
//请按任意键继续. . .

//13 97 79
//6
//请按任意键继续. . .

//13 97 10000
//0
//请按任意键继续. . .
感谢感谢!!!
qzjhjxj 2021-02-16
  • 打赏
  • 举报
回复
楼主的代码,供参考:
//【输入】
//三个正整数a,b,n,相邻两个数之间用单个空格隔开。0<a<b<100,1<=n<=10000。

//【输出】
//一个数字。

//【输入样例】
//1 2 1
//【输出样例】
//5
//例如:13/97=0.13402061855670103092783505154639;
# include  <stdio.h>
# include  <math.h>
using namespace std;
int main()
{
	int n, result,a, b;
	scanf("%d %d %d", &a, &b, &n);
	result = (int)(a*1.0 / b*1.0/(1.0 / pow(10, n))) % 10;
	printf("%d", result); //输出result
	return 0;     //结束程序
}  
//6 5 1
//2请按任意键继续. . .

//13 97 32
//0请按任意键继续. . .

//13 97 10000
//pow: OVERFLOW error   溢出报错
模拟除法的写法,供参考:
//模拟除法过程
//例如:13/97=0.13402061855670103092783505154639;

#include <stdio.h>
using namespace std;

int main()
{
    int a,b,n,c;
    scanf("%d %d %d",&a,&b,&n);
    if(a > b) a = a % b;
    for(int i = 1;i <= n;i ++){
        c = 10 * a / b;
        a = 10 * a - b * c;
    }
    printf("%d\n",c);
    return 0;
}

//6 5 1
//2
//请按任意键继续. . .

//13 97 32
//9
//请按任意键继续. . .

//13 97 79
//6
//请按任意键继续. . .

//13 97 10000
//0
//请按任意键继续. . .
突触 2021-02-16
  • 打赏
  • 举报
回复
//number / (1.0 / pow(10, n))求出number里有几个10的-n次方,然后求出个位数即使题目所求,存入整形变量result 实际上你可以看成,小数点向后移。 式子就变成了number * pow(10, n) % 10 (这里放入程序不会 出现上述问题) 在讲讲 输出结果为11的问题 这里涉及的知识比较多,有兴趣可以去了解下浮点型与16进制的转换关系。 下面作简单讲解: 1.0 / pow(10, n) 的结果为0.1 但是这个数在计算机是没办法存储的,只会存储近似值 大概约等于0.100000000000000006 number 取1.2(实际也取不到,这里为了方便,假设取到了) 那么1.2 / 0.100000000000000006 也就变成了11.99999999999999928 取整数也就是11.
WYHMingMing 2021-02-16
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
最多小数点后一万位呢,需要自己做除法
我没理解您的意思 ,您能说得详细亿点儿吗
  • 打赏
  • 举报
回复
最多小数点后一万位呢,需要自己做除法

64,652

社区成员

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

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