开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C++ 输入的是1.3变1.29999995问题

简介: C++ 输入的是1.3变1.29999995问题
+关注继续查看

今天一位粉丝在评论中问到了这个问题,我简单的说了原理和改进方法,将float改为double就可以了,下面我进行详细整理


先说一下debug是啥意思


马克2号(Harvard Mark II)编制程序的葛丽丝·霍波(Grace Hopper)是一位美国海军准将及计算机科学家,同时也是世界最早的一批程序设计师之一。有一天,她在调试设备时出现故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是,霍波诙谐的把程序故障统称为“臭虫(bug)”,把排除程序故障叫debug,而这奇怪的“称呼”,竟成为后来计算机领域的专业行话。


下面用网上的程序做例子


image


当你设置断点监控变量时,观察调试窗口里的m,发现并不是输入的1.3,而是1.29999995。可是明明输入的1.3,为啥就变了呢?


仔细查看程序,发现变量m定义的是float类型,单精度浮点数。


浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入。


我们知道在C++中浮点数类型有float、double和long double,那么它们之间到底有什么差别呢?


C++中浮点数类型差别是:


  • 在内存中占有的字节数不同


  • 有效数字位数不同


  • 所能表示数的范围不同


ps:数据类型详细介绍请见我另一篇博客


所以,我们将程序中的float修改为double就可以了,强制转换的时候也最好转换为double类型


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C语言格式输入与输出深度剖析
C语言格式输入与输出深度剖析
18 0
CentOS6.4 访问域局网中Windows的共享
mount -t cifs -o sync,username="administrator",password="123456" //10.10.3.246/f /usr/local/openresty/nginx/html/down 说明: mount -t cifs -o 这个就不多说了(照着写吧)。
640 0
22、C语言中输入输出格式控制(2)
1、格式化输入函数scanf 用法: scanf("格式串" ,地址1,地址2,···); 1)格式符 syntax: %[*][width][h|l|L]type (1) [h|l|L]type d 以十进制有符号整数形式转换输入数据 i ...
731 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载