为什么浮点型运算结果会有误差?
如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
为什么浮点型运算结果会有误差?相关推荐
- 开发板浮点型运算能力测试
运算能力测试 前言 Super PI 浮点运算测试 源代码思想 运算测试步骤 测试结果说明 自编浮点测试程序 前言 为了评估 CPU 的浮点运算能力,本文搜罗了"Super PI lin ...
- mysql 取 浮点运算_mysql 浮点型运算误差原因分析及解决方法
在进行金融财务等数值运算时,请使用decimal 类型,不要使用float和double类型!因为decimal的精度最高 如下C#代码: float a = 0.65f; float b = 0.6 ...
- js中浮点型运算 加减乘除
<script> //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:ac ...
- 实例比较单精度浮点型,双精度浮点型运算结果精度
#include<stdio.h> //已知圆半径为r,求圆形周长c,面积s,半径为r球形体积v void main() { float r=3.67, c, s, v; ...
- 关于浮点型加减乘除运算不精确的问题
关于浮点型加减乘除运算不精确的问题 先举一个遇到这个错误的项目例子: 之前做一个小模块,由于后端接口还没有完成,需要自己搭建node服务,返回数据,功能需求是实时更新的,这个小模块中本人没有使用web ...
- c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...
- 7744问题(浮点数的运算可能会存在误差)
7744问题_记:浮点数的运算可能存在误差,不是一定存在,但经常都会 方法一:使用函数sqrt()开平方.floor()返回整数部分判断 //7744,利用+0.5进行四舍五入以避免浮点数运算可能存在 ...
- Python浮点数(小数)运算误差的原因和解决方法
原因解释: 浮点数(小数)在计算机中实际是以二进制存储的,并不精确. 比如0.1是十进制,转换为二进制后就是一个无限循环的数: 0.0001100110011001100110011001100110 ...
- double转换为int以及浮点型相加损失精度问题
最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...
最新文章
- POJ2594 最小路径覆盖
- Preparation for International Women's Day
- Python-函数-Day4
- linux CentOS6.x 修改主机名(Hostname)
- 网上借鉴及自己对git的认知(很早就写了,一直没有上传,如有误解,请指出)...
- Android进阶篇-清除WebView的缓存
- 贪心算法之最小堆实现霍夫曼编码
- Atmospheric Scattering
- 博客导读(09.3.21)
- flex学习网站大全(转)
- Viewport 不权威指南
- 自己闲来无事做的工作日志WEB程序(VB.NET)
- Python3.7 Scrapy crawl 运行出错解决方法
- 数据挖掘十大算法-决策树的实现
- python图像识别生成矢量图_Python matplotlib图片转化成矢量图并裁剪 - 小众知识
- analyze怎么优化oracle,Analyze table对Oracle性能的提升
- 【教育教学资源】教育资讯、教学功能、当老师、或者补习班给学生的资料
- 全球顶级的14位程序员大神!
- 2022年12月编程语言排行榜公布!
- 从键盘输入一个字符串并输出
热门文章
- 各种主流数据库的比较
- Chrome 插件:自己写的插件提示请停用以开发者模式运行的插件处理方法,该拓展程序未列在chrome网上应用商店中,并可能是在您不知情的情况下添加的解决办法
- [学习笔记]数字电路技术
- mysql数据库表格怎么建立_mysql数据库表格怎么建立
- 【解决方案】“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”
- 2018第九届蓝桥省赛题目
- java基础教程传值_Java基础——方法传值(基本数据类型 VS 引用数据类型)
- 调用摄像头_摄像头 | 浏览器调用摄像头并实现截图保存的效果
- git学习笔记(四)—— 分支管理
- PHP基础1--环境搭建