zoukankan      html  css  js  c++  java
  • python3中浮点数相减问题(大部分时候只需要关注整数的二进制形式就行了)

    首先直接上判断方法:一切判断直接将整数部分装化成二进制,如果位数相等则相减后的值是等于的,如果不相等,相减大的结果一定不等于你要比较的结果。
        如66.6-60.6==6.0的情况,66.6的二进制:1000010.100110011001100110011001100110011001100110011
                               60.6的二进制: 111100.10011001100110011001100110011001100110011001101  
                               6.0的二进制:  110
    大家可以看到60.6的整数长度比66.6少一位,而浮点数是保存为4字节32位的,其中第一位是符号位,后面的23位用来保存尾数,尾数就是整数和小数部分组成的,于是上面的答案就出来了,整数短一位,小数保留时肯定会多一位,而整数转化成十进制计算是没有精度损耗的,但是小数却因为缺多了一位导致有精度损耗,所以66.6-60.6结果不可能等于6.0,只能是大于或者小于6.0,以此题为例子,由于60.6小数保留长所以相减的结果小于6.0.
    
    总结:其他任何情况自行按上面的计算,第一步:直接将整数转化成二进制,看位数是否相等,再看23(整数位和小数位的总长)  
    其次:你输入的数最终保存的样子和取出来计算的样子并不是你看到的60.6,而是变化了,虽然你看到的你敲的是60.6。
    
    找到一个合适的图片:
    附上图片:
        
    
    浮点数在计算机中的存储分为三个部分: 
       1. 符号位(sign):float和double符号位均为1位,0代表正数,1代表负数 
       2. 指数位(exponent):存储科学计数法中的指数部分,采用移位存储 
       3. 尾数位(fraction):存储科学计数法中的尾数部分
    
    
    float 的存储方式如下:
    

  • 相关阅读:
    解决部分小程序无法获取UnionId的问题
    你也可以写个聊天程序
    JavaScript 数据结构与算法之美
    CSS content应用
    JS中判断null、undefined与NaN的方法
    IT资料常用网址汇总
    史上最全的正则表达式-匹配中英文、字母和数字
    百万数据修改索引,百万数据修改主键
    SQL Server 2005 实现数据库同步备份 过程--结果---分析
    数据库性能优化三:程序操作优化
  • 原文地址:https://www.cnblogs.com/caiwenjun/p/11978502.html
Copyright © 2011-2022 走看看