刚开始做技术,接触的是硬件相关的编程,因此基本不用小数(浮点数)进行运算,也就没留意到计算机中小数“失精”存储的问题了。最近两年进行网络编程开发,也就是应用层开发了,工作上就接触到很多使用浮点数运算的场景,自然的,“失精”问题也就浮现了。

理清精确缺失问题(失精)

那么什么是”失精”问题?就是计算机是无法准确的存储大部分的十进制小数的。不信,可以运行以下C语言程序:

#include "stdio.h"
void main()
{printf("%.7f", 10.2f-9.0f);getchar();
}

结果输出:0.1999998 而不是0.2000000

既然知道了事实现象,我们就来研究下里面的真相。首先,我们将十进制的10.2用二进制表示:
1010.001100110011………无限小数 (不要问我怎么转的,自己回去补一下转换过程)

再者,将十进制9.0转化为二进制:1001(这个数小数部分为0,所以能够能用有限的数字表示)

好的,将两者相减,就得到:0.001100110011……… 因为计算机存储位数的限制,不可能存储无限位二进制数字,因此最终采用老办法– 截取高位存储,于是结果就是0.001100110011…(IEEE754标准存储24位有效数字),转换为十进制7位小数输出,就得到了0.1999998这个数字。

作为严谨的程序员,我们自然回想为什么十进制小数无法用二进制精确的表示呢?下面引入一个10cm长的杆子。

如果将1看做是这10cm的杆子,那么对于第一位小数,十进制的精度就是1cm,所以能准确的描述2/10的杆子长度4cm;但是二进制的精度是5cm,所以用二进制这个工具根本无法表示4cm,没法准确表示,怎么办呢?

那就无限逼近咯,于是就出现了课本上教我们的十进制转二进制的简易数学方法了。

好了,到此,就明白为什么0.2无法用二进制精确表示的了吧。

那么再总结下规律,十进制中的0.0-0.9这是个小数里面,出了0.0和0.5能被二进制准确表示外,其他都无法准确表示的。同理以2为基数的4进制8进制16进制都有和二进制相同的规律。

那么计算机程序是怎样处理这个问题的呢?

  1. 将浮点数用字符串存储起来,然后对字符进行十进制模拟运算,最后得出结果,这个方法在JAVA里面已经有现成的API。
  2. 对于比较成熟的语言,比如C,就会就运算之后,对结果进行进一步处理,如10.2-9.0=0.1999….,我们知道1位小数减去1位小数,得到的结果绝对不会超过1位小数。因此我们在运算前先记录最大的小数位数n,然后运算后,就对n+1位进行四舍五入的处理即可。

最后提醒一下,要注意一些不太成熟的语言如:php等脚本语言,例子如下

<?php$f = 0.57;echo (int)($f*100); //输出56而不是57
?>

程序开发中的(小数)精度缺失问题--学习记录相关推荐

  1. 项目的命名规范,为以后的程序开发中养成良好的行为习惯

    代码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯. 代码编写规范使用范围:J2EE项目开发. 一.包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 1.s ...

  2. 关于微信小程序开发中遇到的缺少game.json问题的解决

    关于微信小程序开发中遇到的缺少game.json问题的解决 参考文章: (1)关于微信小程序开发中遇到的缺少game.json问题的解决 (2)https://www.cnblogs.com/ygxd ...

  3. DevOps 在移动应用程序开发中扮演什么角色?

    作者 | VARUN BHAGAT 译者 | 火火酱,责编| Carol 封图 | CSDN 付费下载自视觉中国 全球智能手机用户数量已经超过30亿.据估计,未来几年用户人数将增加至数亿人.智能手机用 ...

  4. 解决微信小程序开发中wxss中不能用本地图片

    微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...

  5. 程序开发中的软实力和硬实力

    概述:实力是一种客观存在,而霸权不同,霸权的基础虽然是实力,但它更是一种感知,是其他国家对他实力的感知. 一个大国,当然要积累实力,但重要的是通过战略运作,来经营国际社会对你霸权的感知.这个区别有意思 ...

  6. 程序开发中 status 还是 state

    对比: 程序开发中,两个都解释为状态: status表示关联状态的转变,例如[账户]的正常.冻结.删除: state表示非关联状态的转变,例如[枚举]: 参考: 程序代码中,怎么区分status和st ...

  7. 实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie

    实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie 1-使用npm install axios;命令安装axios 2-新建一个文件夹再建一个.js后缀文件 ...

  8. java写微信小程序答辩问题_微信小程序 开发中遇到问题总结

    微信小程序 开发中遇到问题总结 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载.例: //app.js App({ ...

  9. 微信小程序开发中常见问题及解决方法

    本文章总结小程序开发中常见的错误问题.希望能帮助初学者少走弯路,避免类似的错误. 1:出现"脚本错误或者未正确调用Page()"的错误提示. 解决方法:出现这个错误的原因通常是因为 ...

最新文章

  1. photofunia
  2. linux基础: shell————正则表达式基础及sed
  3. docker build 没有网络 执行dockerfile中yum报错 curl#6 - “Could not resolve host: mirrorlist.centos.org 解决方法
  4. SeekBar的使用(一):实现OnSeekBarChangListener
  5. 高级指引——概念解释——图形 Shape 及其属性
  6. 模型评估准确率、召回率、ROC曲线、AUC总结
  7. B. Bogosort codeforces(思维)
  8. 对安卓应用进行加固签名,为上架各大应用市场做准备
  9. Java开发人员的升级之路
  10. Linux下用vi 打开文件出现乱码
  11. matlab 脚本文件 函数,Matlab 脚本文件script和函数文件function的区别
  12. 编码的奥秘:电筒密谈
  13. 浏览器控件打开PDF文件时文件内容不显示的解决方法
  14. sis地址发布器_【一起练翻译-9.1】关于提词器、真实、川普和演讲
  15. 大数据可视化分析的步骤有哪些
  16. Android仿微信语音聊天
  17. 集成平台即服务,云和……独角兽
  18. 手机上怎么照证件照照片?教你两招轻松拍出证件照
  19. 细说华为和荣耀的关系:潮流的荣耀和稳重的华为
  20. Couldnot load Project The file couldn‘t be opened

热门文章

  1. 关于npm install报错
  2. 使用开源免费软件audacity录制windows 10系统声音
  3. 5-14 周游世界(24分)
  4. 从阿里云mqtt配置解析到用户名密码等信息
  5. 《价值投资实战手册》手把手教你价值投资
  6. 高频电子线路——分频网络
  7. GEE(Google Earth Engine)计算全球的NDVI和SAVI!
  8. winform chart控件设置
  9. 关于广域网与局域网介绍及数据交换
  10. 利用 SSDP 协议生成 100 Gbps DDoS 流量的真相探秘