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