引出

打开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,但会在显示过程进行精度转换,通过整数运算,避免了小数运算过程中的丢失精度问题。

浮点数的运算精度丢失相关推荐

  1. 关于Java浮点数运算精度丢失问题

    2019独角兽企业重金招聘Python工程师标准>>> 关于Java浮点数运算精度丢失问题 博客分类: java 前几天看了一个朋友的博客,说Java中浮点数运算精度丢失的问题,他给 ...

  2. 浮点数运算精度丢失的问题

    导入 在我们平时编码的过程中,你一定遇到过这样的问题: const a = 0.1; const b = 0.2; console.log(a + b); // 0.30000000000000004 ...

  3. Java中浮点数原理及精度丢失问题

    浮点类型用于表示有小数部分的数值.在Java中有两种浮点类型, 类型 储存需求 取值范围 float 4字节 大约±3.40282347E+38F(有效数位6~7位) double 8字节 大约±1. ...

  4. js中浮点数运算精度问题

    在js中,我们有时会遇到计算,通过加减乘除处理某些业务.那么这时候如果不做任何处理,就会出现如下典型的精度丢失问题. console.log(0.1 + 0.2) ; // 0.30000000000 ...

  5. js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法

    浏览器处理数字运算时精度丢失的方法 为什么0.1 + 0.2 不等于0.3.因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数 并不是所有的浮点数在计算机内部都存在舍入 ...

  6. bigdicmal除法精度设置_Java BigDecimal浮点数运算--如何保证运算精度不溢出

    加减乘除四则运算是高级程序设计语言(不论机器语言.汇编还是其他高级语言)最基础的部分,Java作为最流行的软件开发语言之一,涉及四则运算的程序代码和功能业务随处可见.在笔者从事的基于Java语言银行. ...

  7. 浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

    在知乎上上看到如下问题: 浮点数精度问题的前世今生? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3.大家在项目中踩过浮点数精度的坑? 4.最后采用哪些方案规避 ...

  8. Java 避免精度丢失之BigDecimal 运算

    * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入 import java.math.BigDecimal; /** 计算工具类 */ pu ...

  9. js long类型精度丢失_浮点数丢失精度

    问题 浮点数在运算过程中常常会丢失精度,这是由于二进制数的存储特点造成的,在php或者js中进行浮点数运算或者类型转换的时候常常会丢失精度.而在电商公司,对金额比较敏感,是万万不能接受丝毫的误差的. ...

最新文章

  1. 基于JavaWeb实现网上花店商城系统
  2. php的foreach循环执行过程分析以及循环中执行unset()的一些问题
  3. server2008r2/2012R2遠程桌面-企业协议号
  4. html文件设置ftp6,vsftp的安装与配置
  5. sm2算法c 语言实现,移远通信集成国密安全解决方案的C-V2X AP模组商用落地
  6. 授权MySQL账户访问指定数据库
  7. [HDU2294]Pendant
  8. “空天地”一体化的遥感农业保险简介
  9. 利用Docker学习Redis笔记(一)
  10. Java网络编程之通过代码实现Socket通信
  11. 权限系统组织管理—详细设计说明书
  12. 设计资源神器,国外网盘免费下载揭秘!
  13. python 小说分析_谁还没看过几本金庸小说?用Python分析一下当年最爱看的主角是谁...
  14. kafka+fluentd+heka了解资料
  15. C语言枚举类 口袋中有红、黄、蓝、白、黑5种颜色的球若干个
  16. Vue中如果关闭语法检查
  17. java烟弹,java电子烟是啥牌子
  18. android 斜边_android自定义控件之中间是斜线的占比条
  19. swift 引用swift_Swift Swift中的单元测试:基础知识
  20. CE修改器下载、安装和汉化(必会版)

热门文章

  1. CoreAnimation编程指南(简介)
  2. mysql 检查_检查MySQL的健康状况
  3. 最新软件工程总结,项目模板,软工作业下载
  4. 计算机组成原理实用教程课后答案,王万生《计算机组成原理实用教程》课后习题答案..doc...
  5. python txt转json_实战篇 | 用Python来找你喜欢的妹子(二)
  6. JAVA入门级教学之(static关键字)
  7. qt多线程服务器_常见网络服务器并发模型
  8. java中exception_Java中的异常 Exceptions
  9. linux3.x内核实时性改进,linux 3.x内核优化指南
  10. python123数值运算_python123中 Hello World的条件输出 和数值运算