按楼主所给的值,单精度浮点数只能精确到小数点后5位,小数点第6位并非随机给出,而是超出了表示范围发生下溢。不发生溢出,单精度浮点数是可以6位数值都是准确的。
原因:32位单精度浮点数用4字节存储,1位符号+8位指数偏差E+23位数值部分。指数偏差E用以确定小数点位置,其位数决定数的表示范围;数值部分位数决定表示数的精确程度。对于单精度浮点数123.1122334455667788,用二进制表示时,整数部分123=1111011,按单精度数据存储格式因去掉最高位的“1”,故这部分(111011)占用了6位存储空间,还剩23-6=17位存储空间用来存储小数部分数据,能表示的精确度为2^(-17)=7.6*10^(-6)。可以看到,小于7.6*10^(-6)的数是不能正确表示的,即小数点后第6位(十进制)数会发生下溢第5位正常。若把123.1122334455667788的整数部分改小点(减小整数部分占用的空间),例如改成3.1122334455667788第6位便正确显示。可以试下改成23.1122334455667788,第6位不会正确显示,按上述方法计算便知下溢临界值为2^(-19)=1.9*10^(-6)。