浮点数的运算精度丢失
引出
打开Python编译器,输入 0.1+0.2
, 期待的结果是0.3,但是输出为:
0.30000000000000004
有点小尴尬,这是为什么呢?
解惑
其实这设计到了计算机的浮点数存储是以二进制进行存储的。
说二进制不太形象,换成我们最长使用的十进制和分数
1/5,使用小数表示为0.2,但是1/3,使用小数表示就是一个无限循环小数:0.3333333
, 也就是说,分数的 1/3+1/3=2/3,但如果使用小数:0.3333+0.3333=0.6666
, 结果只会无限接近2/3,而不会等于2/3
因为把10分成三份,是不能够整分的。同样,把2分成十份,也不能整分。考虑到2整分只能分成两份,也就是说,二进制只能精确表示十进制小数0.5
十进制到二进制的转换在此略过。
十进制的0.1,转换成二进制是:0.00011001100110011
无限循环的小数,所以二进制的小数运算,就会出现上面的1/3+1/3的情况,无法精确计算,只能够近似表示。那为什么python这些语言,我们在使用的时候没有察觉到这个问题呢?因为编译器自觉的帮我们做了近似的处理。
和十进制无法精确表示分数的1/3同样,二进制也无法精确表示十进制的小数。
分析
为了方便分析,我们讲计算机存储的字节数量进行缩减,我们假设小数点后只能保存8为小数。
十进制的0.1,转换成二进制为:0.00011001 (再反转回十进制,就会发现精度的丢失了,十进制是:0.09765625)
十进制的0.2,转换成二进制为:0.00110011 (反转回十进制,为:0.19921875)
加法运算:
十进制
0.1+0.2=0.3
二进制
0.00011001+0.00110011=0.01001100 (转成十进制:0.296875)
当然,计算机中存储的位数要比8位多,python浮点数占用8个字节,64位。但因为是无限小数,并不是位数多了就会准确。
那么如何做这种精度的计算呢?其实很简单,精度丢失是小数才会有,只要转成整数,就不会有这个问题了。比如Python中:
(1.0+2.0)/10
结果:0.3
, 没毛病。
当然,这个0.3也不是精确的0.3,但会在显示过程进行精度转换,通过整数运算,避免了小数运算过程中的丢失精度问题。
浮点数的运算精度丢失相关推荐
- 关于Java浮点数运算精度丢失问题
2019独角兽企业重金招聘Python工程师标准>>> 关于Java浮点数运算精度丢失问题 博客分类: java 前几天看了一个朋友的博客,说Java中浮点数运算精度丢失的问题,他给 ...
- 浮点数运算精度丢失的问题
导入 在我们平时编码的过程中,你一定遇到过这样的问题: const a = 0.1; const b = 0.2; console.log(a + b); // 0.30000000000000004 ...
- Java中浮点数原理及精度丢失问题
浮点类型用于表示有小数部分的数值.在Java中有两种浮点类型, 类型 储存需求 取值范围 float 4字节 大约±3.40282347E+38F(有效数位6~7位) double 8字节 大约±1. ...
- js中浮点数运算精度问题
在js中,我们有时会遇到计算,通过加减乘除处理某些业务.那么这时候如果不做任何处理,就会出现如下典型的精度丢失问题. console.log(0.1 + 0.2) ; // 0.30000000000 ...
- js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法
浏览器处理数字运算时精度丢失的方法 为什么0.1 + 0.2 不等于0.3.因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数 并不是所有的浮点数在计算机内部都存在舍入 ...
- bigdicmal除法精度设置_Java BigDecimal浮点数运算--如何保证运算精度不溢出
加减乘除四则运算是高级程序设计语言(不论机器语言.汇编还是其他高级语言)最基础的部分,Java作为最流行的软件开发语言之一,涉及四则运算的程序代码和功能业务随处可见.在笔者从事的基于Java语言银行. ...
- 浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源
在知乎上上看到如下问题: 浮点数精度问题的前世今生? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3.大家在项目中踩过浮点数精度的坑? 4.最后采用哪些方案规避 ...
- Java 避免精度丢失之BigDecimal 运算
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入 import java.math.BigDecimal; /** 计算工具类 */ pu ...
- js long类型精度丢失_浮点数丢失精度
问题 浮点数在运算过程中常常会丢失精度,这是由于二进制数的存储特点造成的,在php或者js中进行浮点数运算或者类型转换的时候常常会丢失精度.而在电商公司,对金额比较敏感,是万万不能接受丝毫的误差的. ...
最新文章
- 基于JavaWeb实现网上花店商城系统
- php的foreach循环执行过程分析以及循环中执行unset()的一些问题
- server2008r2/2012R2遠程桌面-企业协议号
- html文件设置ftp6,vsftp的安装与配置
- sm2算法c 语言实现,移远通信集成国密安全解决方案的C-V2X AP模组商用落地
- 授权MySQL账户访问指定数据库
- [HDU2294]Pendant
- “空天地”一体化的遥感农业保险简介
- 利用Docker学习Redis笔记(一)
- Java网络编程之通过代码实现Socket通信
- 权限系统组织管理—详细设计说明书
- 设计资源神器,国外网盘免费下载揭秘!
- python 小说分析_谁还没看过几本金庸小说?用Python分析一下当年最爱看的主角是谁...
- kafka+fluentd+heka了解资料
- C语言枚举类 口袋中有红、黄、蓝、白、黑5种颜色的球若干个
- Vue中如果关闭语法检查
- java烟弹,java电子烟是啥牌子
- android 斜边_android自定义控件之中间是斜线的占比条
- swift 引用swift_Swift Swift中的单元测试:基础知识
- CE修改器下载、安装和汉化(必会版)
热门文章
- CoreAnimation编程指南(简介)
- mysql 检查_检查MySQL的健康状况
- 最新软件工程总结,项目模板,软工作业下载
- 计算机组成原理实用教程课后答案,王万生《计算机组成原理实用教程》课后习题答案..doc...
- python txt转json_实战篇 | 用Python来找你喜欢的妹子(二)
- JAVA入门级教学之(static关键字)
- qt多线程服务器_常见网络服务器并发模型
- java中exception_Java中的异常 Exceptions
- linux3.x内核实时性改进,linux 3.x内核优化指南
- python123数值运算_python123中 Hello World的条件输出 和数值运算