• 对于浮点型数据运算精度丢失问题


     对于浮点型数据运算精度丢失问题:
    产生原因:
        计算机并不能识别除了二进制数据以外的任何数据,无论我们使用何种编程语言,在何种编译环境下工作,都要先 把源程序翻译成二进制的机器码后才能被计算机识别。
        而在存储浮点型数据时,会分为三部分进行存储:
            符号位(Sign) : 0代表正,1代表为负
            指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
            尾数部分(Mantissa):尾数部分
                其中前两位分别为实数符号位和指数符号位,于是存储结构实际为如下:
                        31                  30            29----23        22----0         

                   实数符号位    指数符号位    指数位      有效数位

               但是,在将十进制浮点数转换为二进制浮点数时,小数的二进制有时也是不可能精确的,就如同十进制不能准确表示1/3,二进制也无法准确表示1/10,而double类型存储尾数部分最多只能存储52位,于是,计算机在存储该浮点型数据时,便出现了精度丢失(1)。例如,11.9的内存存储大约为:1011. 1110011001100110011001100...

                而在进行浮点类数据计算的时候,浮点参与计算,会左移或右移n位,直到小数点移动到第一个有效数字的右边。于是11.9在转化为二进制后 小数点左移3位,就得到1. 011 11100110011001100110(精度丢失2)

                于是最终浮点型运算出现了精度丢失误差。

    测试方法:

                建议测试人员在涉及浮点型数据的运算时(如金额),减法运算建议输入被减数2.4,减数2.0。此时结果
                           
                当为加法运算时,建议输入加数分别为0.1+0.2。此时运算结果:
               
                当乘法运算时,建议输入0.2*0.1,此时结果:
        

                 

                当除法运算时,建议0.3/0.1,此时结果:
      
      
  • 相关阅读:
    java 中静态变量和实例变量之间的区别
    java 中final 引用不可变,但是引用还是可以发生变化的
    java中char和Unicode之间的关系
    java 中终止内层循环的方法
    ssh 公钥免密码登陆
    关于Python 中unicode 转码的问题
    Python中Unicode码和非Unicode码引起的错误与格式转换
    第一次写博客,怎么写?
    zookeeper实现主-从结构的一般原理
    Python中Tuple的词源有趣探索
  • 原文地址:https://www.cnblogs.com/Shepherdzhao/p/7768548.html
Copyright © 2020-2023  润新知