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

 对于浮点型数据运算精度丢失问题:
产生原因:
    计算机并不能识别除了二进制数据以外的任何数据,无论我们使用何种编程语言,在何种编译环境下工作,都要先 把源程序翻译成二进制的机器码后才能被计算机识别。
    而在存储浮点型数据时,会分为三部分进行存储:
        符号位(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,此时结果:
  

 

  
posted @ 2017-11-01 21:21  XuepengZ  阅读(5053)  评论(0编辑  收藏  举报