
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.4 最佳实践:判断浮点数为整数
判断浮点数为整数的重要思路是指数能够弥补小数部分(即指数的值大于或等于小数的位数)。例如,在十进制数中,1.23×102是整数,而1.234×102不是整数,因为指数2不能弥补3个小数位。以2为底数的浮点数的判断思路类似。
下面是一段判断浮点数是否为整数的Go代码,笔者接下来会逐行进行分析,以帮助读者加深对浮点数的理解。

要保证浮点数格式中实际存储的数为整数,一个必要条件就是浮点数格式中指数位的值大于127。指数位的值为127代表指数为0,如果指数位的值大于127,则代表指数大于0,反之则代表指数小于0。以十进制数234523为例,其调用IsInt函数后输出如下:

第一步,计算指数。这里多减去了数字23,后面会看到其用途,所以在第一个判断中判断条件为exponent<-23,即比较指数位的值与0的大小。

第二步,通过位运算的方式计算出小数部分的值。

(1<<23)代表在指数位前方加1,得到系数。

第三步,计算IntTest。只有当指数可以弥补小数部分的时候,才是一个整数。例如,数字234523的指数的值是144-127=17,代表其不能弥补最后23-17=6位的小数,即当最后6位不全为0时,数字234523一定为小数。但由于数字234523最后6位刚好都为0,所以可以判断它是整数。
