如var a=0.65;

 var b=0.6;

console.log(a-b)==0.05???错   a-b=0.050000000000000044

为什么?

其根本原因在于计算机所使用的01代码无法准确地表示某些带小数的十进制数据。

下面我们来分析下:

  我们知道将一个十进制数值转换为二进制数值,需要通过下面的计算方法:

  1. 整数部分:连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称"除2取余法"。

  2. 小数部分:十进制小数转换为二进制小数,采用"乘2取整,顺序排列"法。用2乘以十进制小数,将得到的整数部分取出,再用2乘余下的小数部分,然后再将积的整数部分取出,如此进行,直到积中的小数部分为0或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,即先取出的整数部分作为二进制小数的高位,后取出的整数部分作为低位有效位。简称"乘2取整法"。

  3. 含有小数的十进制数转换成二进制,整数、小数部分分别进行转换,然后相加。

  例如:将十进制数值25.75转换为二进制数值,步骤如下:

  25(整数部分)

  25/2=12......1

  12/2=6.......0

  6/2=3......0

  3/2=1......1

  1/2=0......1

  (25) 10=(11001) 2

  0.75(小数部分)

  0.75*2=1.5......1

  0.5*2=1......1

  (0.75) 10=(0.11) 2

  (25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2

  按照上述方法,我们将0.65及0.6转换为二进制代码:

  (0.65)10 = (0.101001100110011001100110011001100110011......)2

  (0.6) 10 = (0.10011001100110011001100110011001100110011......)2

  后面的省略号表示已经算不完了,后面在无限重复 0011 这段二进制数值。

  因为浮点型只能存储32位,所以会进行截取,截取后的二进制代码已无法准确表示0.65和0.6,所以无法得到正确的结果

  解决方法:因为二进制数可以准确表示整数,所以可以先将小数乘10或100等变成整数,然后做运算,最后再通过除以10或100来获得结果。

转载于:https://www.cnblogs.com/xiaoan0705/p/11221463.html

为什么浮点型运算结果会有误差?相关推荐

  1. 开发板浮点型运算能力测试

    运算能力测试 前言 Super PI 浮点运算测试 源代码思想 运算测试步骤 测试结果说明 自编浮点测试程序 前言   为了评估 CPU 的浮点运算能力,本文搜罗了"Super PI lin ...

  2. mysql 取 浮点运算_mysql 浮点型运算误差原因分析及解决方法

    在进行金融财务等数值运算时,请使用decimal 类型,不要使用float和double类型!因为decimal的精度最高 如下C#代码: float a = 0.65f; float b = 0.6 ...

  3. js中浮点型运算 加减乘除

    <script> //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:ac ...

  4. 实例比较单精度浮点型,双精度浮点型运算结果精度

    #include<stdio.h>    //已知圆半径为r,求圆形周长c,面积s,半径为r球形体积v void main() {    float r=3.67, c, s, v;    ...

  5. 关于浮点型加减乘除运算不精确的问题

    关于浮点型加减乘除运算不精确的问题 先举一个遇到这个错误的项目例子: 之前做一个小模块,由于后端接口还没有完成,需要自己搭建node服务,返回数据,功能需求是实时更新的,这个小模块中本人没有使用web ...

  6. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...

    运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...

  7. 7744问题(浮点数的运算可能会存在误差)

    7744问题_记:浮点数的运算可能存在误差,不是一定存在,但经常都会 方法一:使用函数sqrt()开平方.floor()返回整数部分判断 //7744,利用+0.5进行四舍五入以避免浮点数运算可能存在 ...

  8. Python浮点数(小数)运算误差的原因和解决方法

    原因解释: 浮点数(小数)在计算机中实际是以二进制存储的,并不精确. 比如0.1是十进制,转换为二进制后就是一个无限循环的数: 0.0001100110011001100110011001100110 ...

  9. double转换为int以及浮点型相加损失精度问题

    最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...

最新文章

  1. POJ2594 最小路径覆盖
  2. Preparation for International Women's Day
  3. Python-函数-Day4
  4. linux CentOS6.x 修改主机名(Hostname)
  5. 网上借鉴及自己对git的认知(很早就写了,一直没有上传,如有误解,请指出)...
  6. Android进阶篇-清除WebView的缓存
  7. 贪心算法之最小堆实现霍夫曼编码
  8. Atmospheric Scattering
  9. 博客导读(09.3.21)
  10. flex学习网站大全(转)
  11. Viewport 不权威指南
  12. 自己闲来无事做的工作日志WEB程序(VB.NET)
  13. Python3.7 Scrapy crawl 运行出错解决方法
  14. 数据挖掘十大算法-决策树的实现
  15. python图像识别生成矢量图_Python matplotlib图片转化成矢量图并裁剪 - 小众知识
  16. analyze怎么优化oracle,Analyze table对Oracle性能的提升
  17. 【教育教学资源】教育资讯、教学功能、当老师、或者补习班给学生的资料
  18. 全球顶级的14位程序员大神!
  19. 2022年12月编程语言排行榜公布!
  20. 从键盘输入一个字符串并输出

热门文章

  1. 各种主流数据库的比较
  2. Chrome 插件:自己写的插件提示请停用以开发者模式运行的插件处理方法,该拓展程序未列在chrome网上应用商店中,并可能是在您不知情的情况下添加的解决办法
  3. [学习笔记]数字电路技术
  4. mysql数据库表格怎么建立_mysql数据库表格怎么建立
  5. 【解决方案】“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”
  6. 2018第九届蓝桥省赛题目
  7. java基础教程传值_Java基础——方法传值(基本数据类型 VS 引用数据类型)
  8. 调用摄像头_摄像头 | 浏览器调用摄像头并实现截图保存的效果
  9. git学习笔记(四)—— 分支管理
  10. PHP基础1--环境搭建